Thanks very much John Let me check
Rgds, Abhi On Sunday, January 8, 2017 at 8:18:03 PM UTC+5:30, John Souvestre wrote: > > Hi Abhi. > > > > An afterthought: For the “done” case, add a check to clear out any “cs” > values which might come in just before the “done” signal. You won’t need > to worry about this in the “timeout” case. > > > > John > > John Souvestre - New Orleans LA > > > > *From:* John Souvestre [mailto:[email protected] <javascript:>] > *Sent:* 2017 January 08, Sun 07:27 > *To:* 'golang-nuts' > *Subject:* RE: [go-nuts] Multiple goroutine timeout for waitgroup not > working > > > > Hi Abhi. > > > > I’m thinking something like this might do the job. Call monitorWorker(wg, > done) as a goroutine and change it to do just the wg.Wait then send a > signal on the “done” channel. > > > > Next, start a goroutine which signals on a “timeout” channel if the > timeout is exceeded. > > > > Finally, change GetWorkerValues to be an endless loop containing a select > with three cases: “<-cs” (add new value to array), “<-done” (break), and > “<-timeout” (break). After the loop, send the array. > > > > John > > John Souvestre - New Orleans LA > > > > *From:* [email protected] <javascript:> [mailto:[email protected] > <javascript:>] > *Sent:* 2017 January 08, Sun 07:10 > *To:* John Souvestre > *Cc:* golang-nuts > *Subject:* Re: [go-nuts] Multiple goroutine timeout for waitgroup not > working > > > > Hi John > > > > Can you please help me to apply correct logic to achieve it > > > > Haven't found any solution on the net. All articles are talking about only > 1 routine timeout and not multiple > > > > Thank you very much > > > > Rgds > > > > Abhi > > > On Jan 8, 2017, at 6:36 PM, John Souvestre <[email protected] > <javascript:>> wrote: > > Hi Abhi. > > > > I believe that your logic is faulty. The timeout does take place – but it > doesn’t really do what you wanted, I think. > > > > GetWorkerValues isn’t going to send it’s info because the “range cs” can’t > finish until the channel is closed. The channel is not closed until both > workers are finished – timeout or not, thus it always contains the info for > both workers. > > > > John > > John Souvestre - New Orleans LA > > > > *From:* [email protected] <javascript:> [ > mailto:[email protected] <javascript:>] *On Behalf Of * > [email protected] <javascript:> > *Sent:* 2017 January 08, Sun 06:24 > *To:* golang-nuts > *Subject:* Re: [go-nuts] Multiple goroutine timeout for waitgroup not > working > > > > hi John > > > > I am expecting work2 should not include in > > > > headers = <-messgesResponse > > > > so output of below should be Len = 1 and should print only work 1 only and > not 2 ( as work 2 is timed out ) > > > > fmt.Printf("len > %s\n", len(headers)) > > > > for i:=0;i<len(headers);i++ { > > fmt.Printf("Name > %s\n", headers[i].Name) > > } > > > > basically workgroup timeout doesnt close the timeout works > > > > select { > > case <-time.After(2 * time.Second): //This works > but dont stop the work2 > > return > > } > > > > Do I need to explicitly close them in > > > > select { > > case <-time.After(2 * time.Second): > > close(cs) > > return > > } > > > > Thanks for the help > > > > Rgds, > > > > Abhi > > On Sunday, January 8, 2017 at 5:40:01 PM UTC+5:30, John Souvestre wrote: > > Hi Abhi. > > > > I believe that the wait group timeout (in monitorWorker) was set to 2 > seconds in the code you posted. > > > > I put a debugging print in the timeout case, and it is taking place. > > > > What were you expecting to see? > > > > John > > John Souvestre - New Orleans LA > > > > *From:* [email protected] [mailto:[email protected]] *On > Behalf Of *[email protected] > *Sent:* 2017 January 08, Sun 05:48 > *To:* golang-nuts > *Subject:* Re: [go-nuts] Multiple goroutine timeout for waitgroup not > working > > > > hi John > > > > Thanks for the reply > > > > sorry > > > > I mean Work2 takes => 3 seconds > > work1 takes => 1 seconds > > > > Wait group timeout is => 1 seconds > > > > It is expected that only Work1 should get done and Work 2 should get > timeout which is not happening > > > > Waitgroup waits for both work.. program doing something wrong > > > > func Work2(message chan *TestStruct, wg *sync.WaitGroup, tokenNumber > string) { > > > > defer wg.Done() > > > > v1 := new(TestStruct) > > v1.Name = tokenNumber > > time.Sleep(3 * time.Second) > > > > message <- v1 > > > > fmt.Printf("finished %s\n", tokenNumber) > > } > > > > Thanks, > > > > Abhi > > > On Sunday, January 8, 2017 at 5:09:56 PM UTC+5:30, John Souvestre wrote: > > What do you see when you run it? I see: > > > > finished 1 > > finished 2 > > len > %!s(int=2) ç Using a string format for an int > > Name > 1 > > Name > 2 > > > > Ø Work 2 - have 3 second > > > > I’m not sure exactly what you are trying to do, but I suspect that > changing “messges” to hold 2 items might make it work. > > > > messges := make(chan *TestStruct, 2) > > > > I’m guessing, but I suspect that you didn’t realize that if Work1 runs > first, then Work2 will block since the channel is full (or until you close > it). > > > > John > > John Souvestre - New Orleans LA > > > > *From:* [email protected] [mailto:[email protected]] *On > Behalf Of *[email protected] > *Sent:* 2017 January 08, Sun 01:23 > *To:* golang-nuts > *Subject:* [go-nuts] Multiple goroutine timeout for waitgroup not working > > > > > > Can you please help to correct below program where timeout not seems > working > > > > Work 1 - have 1 second > > Work 2 - have 3 second > > Total Timeout - 2 sec > > > > program wait for entire 3 seconds and return both values rather than value > from Work 1 > > > > Program > > > > > package main > > > > import ( > > "fmt" > > "time" > > "sync" > > ) > > > > > > type TestStruct struct { > > Name string > > } > > > > func main() { > > > > wg := &sync.WaitGroup{} > > messges := make(chan *TestStruct, 1) > > > > wg.Add(1) > > go Work1(messges, wg, "1") > > wg.Add(1) > > go Work2(messges, wg, "2") > > > > monitorWorker(wg, messges) > > > > messgesResponse := make(chan []*TestStruct) > > go GetWorkerValues(messges, messgesResponse) > > > > headers := make([]*TestStruct, 0) > > headers = <-messgesResponse > > > > fmt.Printf("len > %s\n", len(headers)) > > > > for i:=0;i<len(headers);i++ { > > fmt.Printf("Name > %s\n", headers[i].Name) > > } > > } > > > > > > > > func monitorWorker(wg *sync.WaitGroup, cs chan *TestStruct) { > > go func() { > > defer close(cs) > > wg.Wait() > > }() > > > > select { > > case <-time.After(2 * time.Second): > > return > > } > > > > } > > func Work1(message chan *TestStruct, wg *sync.WaitGroup, tokenNumber > string) { > > > > defer wg.Done() > > > > v1 := new(TestStruct) > > v1.Name = tokenNumber > > time.Sleep(1 * time.Second) > > > > message <- v1 > > fmt.Printf("finished %s\n", tokenNumber) > > } > > > > func Work2(message chan *TestStruct, wg *sync.WaitGroup, tokenNumber > string) { > > > > defer wg.Done() > > > > v1 := new(TestStruct) > > v1.Name = tokenNumber > > time.Sleep(1 * time.Second) > > > > message <- v1 > > > > fmt.Printf("finished %s\n", tokenNumber) > > } > > > > > > func GetWorkerValues(cs <-chan *TestStruct, response chan<- []*TestStruct) > { > > var val []*TestStruct > > > > for header := range cs { > > val = append(val, header) > > } > > > > response <- val > > } > > > > > > Thanks, > > > > Abhi > > -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > > -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > > -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected] <javascript:>. > For more options, visit https://groups.google.com/d/optout. > > -- > You received this message because you are subscribed to a topic in the > Google Groups "golang-nuts" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/golang-nuts/o0DYWZIlmvs/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > [email protected] <javascript:>. > For more options, visit https://groups.google.com/d/optout. > > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
