我认为这更多是关于逻辑的问题,而不是本身。我想找到一种基于go语言依赖关系执行任务的方法。
考虑以上工作流程:任务1,2,3和4可以同时异步运行。任务1和2完成后,将执行任务10。当任务3和4完成时,将执行任务11。当任务11和12完成时,将执行任务12。当任务10和11完成时,将执行任务100。
我正在使用Go通道进行并发执行,并想找到一种控制依赖关系的有效方法。我知道我可以有某种标志和一个表来控制执行,但理想情况下,我想在内存中执行该操作以避免数据库调用来控制此类操作。我也知道有多种方法可以做到这一点,但是我想听听您的想法,因为我敢肯定有比到目前为止我能想到的更好的方法。
响应文章“如何在继续之前等待所有Goroutine完成执行”,该主题上有一个有趣的reddit线程。
正确的文章是“如何在继续之前等待所有goroutine完成执行,第二部分:解决问题”,并说明了在继续执行另一任务之前等待goroutine的几种方法。
根据要同步任务的信息类型,它sync.WaitGroup
是一个不错的选择(如本例所示)。
但:
当您知道期望的消息数量时,您不妨算一下它们以了解何时完成。这里的WaitGroup是多余的和令人困惑的。
这将阻塞,直到收到所有3条消息:
func main() {
messages := make(chan int)
go func() {
time.Sleep(time.Second * 3)
messages <- 1
}()
go func() {
time.Sleep(time.Second * 2)
messages <- 2
}()
go func() {
time.Sleep(time.Second * 1)
messages <- 3
}()
for i := 0; i < 3; i++ {
fmt.Println(<-messages)
}
}
因此,这实际上取决于您对正在等待的任务的了解。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句