我会用一个黑客无效的素数查找器来使这个问题更具体。我们如何确定Go中“最后”工作进程/线程何时完成?
让我们假设我们的主要功能引发了一堆“工作人员”goroutines。他们会将结果报告给打印它们的单个通道。但是并非每个员工都会报告,所以我们不能使用计数器来知道上一份工作何时完成。还是有办法?
对于具体的例子,在这里,主要关闭goroutines来检查值2 ... 1000是否为素数(是的,我知道它是低效的)。
package main
import (
"fmt"
"time"
)
func main() {
c := make(chan int)
go func() {
for {
fmt.Print(" ", <- c)
}
}()
for n := 2; n < 1000; n++ {
go printIfPrime(n, c)
}
time.Sleep(2 * time.Second) // <---- THIS FEELS WRONG
}
func printIfPrime(n int, channel chan int) {
for d := 2; d * d <= n; d++ {
if n % d == 0 {
return
}
}
channel <- n
}
我的问题是,我不知道如何在合适的时间可靠地停止它。我尝试在main
的末尾添加一个睡眠并且它可以工作(但它可能需要很长时间,而这不是编写并发代码的方法!)。我想知道是否有办法通过某个频道发送停止信号或其他东西,因此main
可以在正确的时间停止。
这里的诀窍是,我不知道会有多少员工回复。
这是不可能的还是有一个很酷的把戏?
(如果有这个典型的例子一个答案,太棒了。我也许可以概括。或者,也许不是。也许这是应用特定的?)
这是利用等待的用户组_really_很好的例子。 –