如何等待所有协程完成?

2024-03-18

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

我的代码简化如下:

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()需要在协程内,执行的主线被推迟到“完成”,因此输出如下所示:

donehello
hello
hello
hello

我想等待作业完成,例如使用sync.WaitGroup在围棋中。所以我的输出肯定是这样的:

hello
hello
hello
hello
...
done

我该如何实现这个目标?


实际上对于你的样品job.join()是确保此时它等待给定作业完成的方法。不幸的是你把它装在一个GlobalScope.launch再次,这只是将其置于后台线程中等待。因此它达到了done比你预期的更早,在我的机器上它甚至没有打印任何内容hello(但可以)。

我假设你用过launch因为join只能从协程或另一个挂起函数中调用?对于您的示例,只需添加就足够了suspend to main, e.g.:

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. 协程基础知识 https://kotlinlang.org/docs/reference/coroutines/basics.html#coroutine-basics
  2. 避免 GlobalScope 的原因 https://medium.com/@elizarov/the-reason-to-avoid-globalscope-835337445abc by 罗曼·伊利扎罗夫 https://stackoverflow.com/users/1051598/roman-elizarov
  3. 并发协程——并发不是并行 https://kotlinexpertise.com/kotlin-coroutines-concurrency/ by @s1m0nw1 https://stackoverflow.com/users/8073652/s1m0nw1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何等待所有协程完成? 的相关文章

随机推荐