如何等待所有协程结束? [英] How to wait for all coroutines to finish?

查看:22
本文介绍了如何等待所有协程结束?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在启动一个协程,我希望它在继续执行主线程之前完成。

我的简化代码如下所示:

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")
}
现在免责声明..。在继续之前,您可能希望参考以下来源(如果您还没有这样做):

  1. Coroutine basics
  2. The reason to avoid GlobalScopeRoman Elizarov
  3. Concurrent coroutines - Concurrency is not parallelism@s1m0nw1

这篇关于如何等待所有协程结束?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆