假设我有一个名为CryptographyScope
的协程范围:
object CryptographyScope : CoroutineScope {
override val coroutineContext: CoroutineContext =
Dispatchers.IO + CoroutineName("CryptographyScope")
}
因此,在我的应用程序中的许多地方,我都叫CryptographyScope.async
。
CryptographyScope.async {
cryptographyService.decrypt(value)
}
当cryptographyService.decrypt(value)
之一失败并引发异常时会发生什么?它会在执行时取消应用程序中使用CryptographyScope
的所有协程吗?
CryptographyScope应该是单例吗?
答案 0 :(得分:0)
CoroutineScope定义一个范围,您可以在其中包含,界定和跟踪所有并发操作,并将它们与应用程序实体的生命周期绑定在一起。
我打算通过我创建的decrypt
的自定义范围来调用CryptographyScope
。但是,这是不对的,因为我没有一个定义了生命周期的实体,因此无法避免发生泄漏。
正确的做法是:
fun decryptAll() = coroutineScope {
async {
cryptographyService.decrypt(value1)
}
async {
cryptographyService.decrypt(value2)
}
}
答案 1 :(得分:0)
GlobalScope.launch {}在“全局”范围内启动一个新的协程,而启动{}在CoroutineScope上启动一个新的协程。
例如
fun main() {
println("1. Let's start")
runBlocking {
launch {
delay(1000)
println("3. coroutine ONE")
}
launch {
delay(500)
println("2. coroutine TWO")
}
}
println("4. Only when the children inside runBlocking complete, execution follows on this line")
}
在上面的代码段中,仅在runBlocking {}内定义的两个协程都完成时,才会执行第4行。
现在让我们尝试使用GlobalScope.launch {}运行相同的代码:
fun main() {
println("1. with GlobalScope.launch {}")
runBlocking {
GlobalScope.launch {
delay(1000)
println("3. coroutine ONE ")
}
GlobalScope.launch {
delay(100)
println("2. coroutine TWO")
}
}
println("4. This line will execute even if the coroutines inside runBlocking did not complete.")
}
在上面的代码片段4中。即使runBlocking内部的协程未完成,该行也将执行。
但是,在上面的示例中启动的协程在单独的“全局”范围内运行,其中runBlocking无法对其进行控制。