本文介绍了如何等待所有协程结束?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
Coroutine basics
The reason to avoid GlobalScope由Roman Elizarov
Concurrent coroutines - Concurrency is not parallelism由@s1m0nw1
我正在启动一个协程,我希望它在继续执行主线程之前完成。
我的简化代码如下所示:
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") } 现在免责声明..。在继续之前,您可能希望参考以下来源(如果您还没有这样做):更多推荐
如何等待所有协程结束?
发布评论