asynchronous - Golang persistent channel accepting input from multiple function calls -
i have function a
:
func a(input *some_type) { // sth. b(input) }
this function gets called multiple times. want function b
wait indefinitely input function a
, perform action when has collected n inputs.
func b(input *some_type) { // wait until received n inputs sth. inputs }
how go doing this? first thought use sync.waitgroup
channel between a
, b
.
this common producer-consumer problem. use channels wait on input routine. help?
in particular example, have call go b(c)
again after collecting inputs terminates, wrap whatever b
in infinite for
loop. or whatever needs happen.
please note in example, , unbuffered channel
used, forces both routines meet @ same time "hand off" *thing
. if want producer (a
's process) not have wait, can use buffered channel, created so:
c := make(chan(*thing, n))
where n
number of items channel can store. allows several queued producer.
https://play.golang.org/p/x14_qsssu4
package main import ( "fmt" "time" ) type thing struct { n int } func a(t *thing, c chan (*thing)) { // stuff happens. whee c <- t } func b(c chan (*thing)) { things := []*thing{} := 0; < 10; i++ { t := <-c things = append(things, t) fmt.printf("i have %d things\n", i+1) } fmt.println("i have 10 things! let's roll!") // stuff ten things } func main() { fmt.println("hello, playground") c := make(chan (*thing)) go b(c) // done producer-consumer in go-routine := 0; < 10; i++ { a(&thing{i}, c) time.sleep(time.second) } time.sleep(time.second) fmt.println("program finished") }
Comments
Post a Comment