从挂起的函数启动协程

vac*_*ach 8 kotlin kotlin-coroutines

鉴于我们有一个挂起函数但this不是 a CoroutineScope,我们如何启动其他协程,使其与运行此suspending函数的任何对象的当前范围相关联?

Mar*_*nik 8

每个可挂起的函数都可以访问全局变量coroutineContext,您可以简单地将CoroutineScope其包装在 中,但这不是其预期目的。它在那里,因此您可以随时检查您的协程是否被取消,获取调试信息(如作业名称等)。

用 Roman Elizarov 在他最近的Medium 帖子中的话来说

suspend fun doNotDoThis() {
    CoroutineScope(coroutineContext).launch {
        println("I'm confused")
    }
}
Run Code Online (Sandbox Code Playgroud)

不要这样做!

一个可挂起的函数不应该触发它返回后可能继续的并发工作。它应该只使用并发来实现任务的并行分解,这意味着它将等待所有子协程完成。

您应该决定使用作为接收者的普通函数CoroutineScope(表示启动并发工作的意图)使用等待其启动的所有工作完成的可挂起函数。

所以,如果你想要并行分解,那么使用一个coroutineScope或者,可能是一个supervisorScope块:

coroutineScope {
    launch { 
        // ... task to run in the background
    }
    // ... more work while the launched task runs in parallel
}
// All work done by the time we reach this line
Run Code Online (Sandbox Code Playgroud)

coroutineScope 是一个可挂起的函数,在它启动的所有协程完成之前它不会完成。