【发布时间】:2022-01-28 00:08:00
【问题描述】:
如果我有多个 goroutine 读写同一个通道,有什么方法可以在某个时间点关闭通道,例如在写入固定数量的元素之后。
func foo(c chan int) {
for i := range c {
// how to close the channel after 100 integers are written?
c <- i + 1
c <- i + 2
}
}
func bar() {
c := make(chan int, 200)
c <- 0
go foo(c)
go foo(c)
go foo(c)
}
【问题讨论】:
-
一个频道只能关闭一次。如果您有多个发件人,则必须协调他们。见Closing channel of unknown length
-
你通常不希望在这样的 goroutine 中从同一个通道接收和发送,因为它使通道和数据的所有权难以确定,并且很容易产生死锁。您要解决的问题是什么?
-
这能回答你的问题吗? Closing channel of unknown length
-
@icza Waitgroup 在我知道发件人何时完成时很有用,但在这种情况下,发件人处于通道接收循环中,很难确定何时在 waitgroup 上完成
-
@JimB 我正在尝试编写一个 sha256 蛮力程序,每次从通道接收一个字符串都会发回 n 个字符串,例如接收“a”,发送“aa”,...,“az”
标签: go concurrency goroutine