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()但是你可以做一件事,在函數的兩個連續(xù)步驟之間放置一定的間隔。但是不建議設置固定的時間間隔,您需要編寫一些代碼來確保完成這些工作。只是展示這個例子,向你展示這里發(fā)生了什么。
func runLoop(second chan int) {
for i := 0; i < 5; i++ {
fmt.Println("writing i", i)
second <- i
time.Sleep(100 * time.Millisecond) // <-- here
}
}
這里發(fā)生了什么?只需給予足夠的時間來完成在單獨的 goroutine 中運行的作業(yè)。
輸出:
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 關注
- 121 瀏覽
添加回答
舉報