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 <j...@souvestre.com> 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: golang-nuts@googlegroups.com [mailto:golang-nuts@googlegroups.com] On > Behalf Of desaiabhi...@gmail.com > 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: golan...@googlegroups.com [mailto:golan...@googlegroups.com] On Behalf > Of desaia...@gmail.com > 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: golan...@googlegroups.com [mailto:golan...@googlegroups.com] On Behalf > Of desaia...@gmail.com > 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 golang-nuts...@googlegroups.com. > 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 golang-nuts...@googlegroups.com. > 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 golang-nuts+unsubscr...@googlegroups.com. > 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 > golang-nuts+unsubscr...@googlegroups.com. > 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 golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.