Golang 持久通道接受来自多个函数调用的输入
Golang persistent channel accepting input from multiple function calls
我有一个函数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
之间的通道。
这是一个常见的生产者-消费者问题。使用通道等待来自另一个例程的输入。这样的事情有帮助吗?
在此特定示例中,您必须在收集输入终止后再次调用 go b(c)
,但您可以轻松地将 b
所做的任何事情包装在无限 for
循环中.或者任何需要发生的事情。
请注意,在此示例中,使用了无缓冲 channel
,这会强制两个例程同时满足 "hand off" 和 *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(&Thing{i}, c)
time.Sleep(time.Second)
}
time.Sleep(time.Second)
fmt.Println("Program finished")
}
我有一个函数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
之间的通道。
这是一个常见的生产者-消费者问题。使用通道等待来自另一个例程的输入。这样的事情有帮助吗?
在此特定示例中,您必须在收集输入终止后再次调用 go b(c)
,但您可以轻松地将 b
所做的任何事情包装在无限 for
循环中.或者任何需要发生的事情。
请注意,在此示例中,使用了无缓冲 channel
,这会强制两个例程同时满足 "hand off" 和 *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(&Thing{i}, c)
time.Sleep(time.Second)
}
time.Sleep(time.Second)
fmt.Println("Program finished")
}