如何等待所有Coroutines完成



我正在启动一个coroutine,我希望在恢复主线程执行之前完成。

我的代码简化看起来像这样:

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()需要在Coroutine内部,因此执行的主线被延迟到"完成",因此输出看起来像这样:

donehello
hello
hello
hello

我想等待工作完成,例如在GO中使用sync.WaitGroup。因此,我的输出在确定性上看起来像这样:

hello
hello
hello
hello
...
done

我该如何完成?

实际上为您的样本job.join()是确保此时等待直到给定作业完成的方法。不幸的是,您再次将其包装在GlobalScope.launch中,这只是将其等待在背景线程中。因此,它较早地到达done,然后您期望并在我的计算机上没有打印任何hello(但可以(。

我假设您使用了launch,因为join只能从Coroutine或其他悬浮功能中调用?就您的示例而言,仅将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. 避免罗马伊丽莎白的GlobalsCope的原因
  3. 并发coroutines-并发不是 @s1m0nw1
  4. 的并行性

相关内容

  • 没有找到相关文章

最新更新