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]]
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] [mailto:[email protected]]
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]> 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] [mailto:[email protected]] On
Behalf Of [email protected]
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] <javascript:>
[mailto:[email protected] <javascript:> ] On Behalf Of
[email protected] <javascript:>
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] <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.
--
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].
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.