2 回答
TA贡献1843条经验 获得超7个赞
您可以编写 goroutine 以便它们相互等待。例如,这是一个位于生产者和消费者之间的中级传输器函数,并迫使他们缓慢前进:
func middle(in, out chan int, inAck, outAck chan struct{}) {
defer close(out)
for value := range in {
fmt.Println("middle got", value)
out <- value // send
fmt.Println("middle now waiting for ack from final")
<-outAck // wait for our consumer
inAck <- struct{}{} // allow our producer to continue
}
}
但总而言之,这是愚蠢的。强制生产者等到消费者完成并使用通道是没有意义的,因为如果我们想让生产者等待,我们只需编写:
for ... {
produced_value = producerStep()
final(middle(produced_value))
}
whereproducerStep()产生下一个值,完全省去通道。
TA贡献1770条经验 获得超3个赞
代码按预期工作。runLoop()但是你可以做一件事,在函数的两个连续步骤之间放置一定的间隔。但是不建议设置固定的时间间隔,您需要编写一些代码来确保完成这些工作。只是展示这个例子,向你展示这里发生了什么。
func runLoop(second chan int) {
for i := 0; i < 5; i++ {
fmt.Println("writing i", i)
second <- i
time.Sleep(100 * time.Millisecond) // <-- here
}
}
这里发生了什么?只需给予足够的时间来完成在单独的 goroutine 中运行的作业。
输出:
writing i 0
seconds stats 0
base stats 0
writing i 1
seconds stats 1
base stats 1
writing i 2
seconds stats 2
base stats 2
writing i 3
seconds stats 3
base stats 3
writing i 4
seconds stats 4
base stats 4
- 2 回答
- 0 关注
- 141 浏览
添加回答
举报
