给定我们有一个暂停函数,但this
不是CoroutineScope
,我们如何启动其他协程,以使它们与运行suspending
函数的当前范围相关联?
最佳答案
每个可挂起的函数都可以访问全局变量coroutineContext
,您可以将其琐细地包装在CoroutineScope
中,但这不是其预期目的。它在那里,因此您可以随时检查协程是否已取消,到达调试信息(如作业名称等)。
用罗曼·伊里扎洛夫(Roman Elizarov)在他最近的Medium post中的话:
可挂起的函数不应触发可能在返回后继续进行的并发工作。它应该仅使用并发来实现任务的并行分解,这意味着它将等待所有子协程完成。
您应该决定使用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
coroutineScope
是一个可挂起的函数,只有在它启动的所有协程完成后才能完成。