如何等待所有协程结束? [英] How to wait for all coroutines to finish?
本文介绍了如何等待所有协程结束?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在启动一个协程,我希望它在继续执行主线程之前完成。
我的简化代码如下所示:
fun hello() {
for (i in 0..100) {
println("hello")
}
}
fun main(args: Array<String>) {
val job = GlobalScope.launch { hello() } //launch parallel
GlobalScope.launch { job.join() } //try to wait for job to finish
print("done")
}
问题是,因为job.join()
需要在协程中,所以执行的主行被推迟到"Done",所以输出如下所示:
donehello
hello
hello
hello
我希望等待作业完成,就像在Go中使用sync.WaitGroup
一样。因此,我的输出肯定如下所示:
hello
hello
hello
hello
...
done
如何完成此操作?
推荐答案
实际上,对于您的样本,job.join()
是确保在这一点上等待到给定作业完成的方法。不幸的是,您再次将其打包到GlobalScope.launch
中,这只是将等待置于后台线程中。因此,它比您预期的更早到达done
,在我的计算机上,它甚至没有打印任何hello
(但它可以)。
launch
,因为join
只能从协程或其他挂起函数调用?对于您的示例,只需将suspend
添加到main
即可,例如:
suspend fun main() {
val job = GlobalScope.launch { hello() }
job.join()
print("done")
}
或者您可以使用runBlocking
并用它将main
括起来,例如:
fun main() = runBlocking {
val job = launch { hello() }
job.join()
print("done")
}
现在免责声明..。在继续之前,您可能希望参考以下来源(如果您还没有这样做):
- Coroutine basics
- The reason to avoid GlobalScope由Roman Elizarov
- Concurrent coroutines - Concurrency is not parallelism由@s1m0nw1
这篇关于如何等待所有协程结束?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文