Golang 持久通道接受来自多个函数调用的输入
Posted
技术标签:
【中文标题】Golang 持久通道接受来自多个函数调用的输入【英文标题】:Golang persistent channel accepting input from multiple function calls 【发布时间】:2017-09-03 03:31:28 【问题描述】:我有一个函数a
:
func a(input *some_type)
// do sth.
b(input)
这个函数被多次调用。
我想要一个函数 b
无限期地等待来自函数 a
的输入,并在它收集到 n 个输入时执行一个操作。
func b(input *some_type)
// wait until received n inputs then do sth. with all inputs
我该怎么做呢?我的第一个想法是使用sync.WaitGroup
和a
和b
之间的频道。
【问题讨论】:
【参考方案1】:这是一个常见的生产者-消费者问题。使用通道等待来自另一个例程的输入。这样的事情有帮助吗?
在这个特定示例中,您必须在收集输入后再次调用 go b(c)
,因为它终止,但您可以轻松地将 b
所做的任何事情包装在无限 for
循环中。或者任何需要发生的事情。
请注意,在此示例中,使用了无缓冲的channel
,这会强制两个例程同时满足以“移交”*Thing
。如果您希望生产者(a
的进程)不必等待,您可以使用缓冲通道,其创建方式如下:
c := make(chan(*Thing, n))
其中n
是频道可以存储的项目数。这允许生产者将几个排队。
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
for i := 0; i < 10; i++
t := <-c
things = append(things, t)
fmt.Printf("I have %d things\n", i+1)
fmt.Println("I now have 10 things! Let's roll!")
// do stuff with your ten things
func main()
fmt.Println("Hello, playground")
c := make(chan (*Thing))
go b(c)
// this would probably be done producer-consumer like in a go-routine
for i := 0; i < 10; i++
a(&Thingi, c)
time.Sleep(time.Second)
time.Sleep(time.Second)
fmt.Println("Program finished")
【讨论】:
以上是关于Golang 持久通道接受来自多个函数调用的输入的主要内容,如果未能解决你的问题,请参考以下文章