Kotlin 协程作用域定义
Kotlin coroutine scope definition
假设我有一个名为 CryptographyScope
的协程作用域:
object CryptographyScope : CoroutineScope {
override val coroutineContext: CoroutineContext =
Dispatchers.IO + CoroutineName("CryptographyScope")
}
因此,在我的应用程序的许多地方我都调用了 CryptographyScope.async
。
CryptographyScope.async {
cryptographyService.decrypt(value)
}
当 cryptographyService.decrypt(value)
之一失败并抛出异常时会发生什么?它是否会在执行时取消应用程序中使用 CryptographyScope
的每个协程?
CryptographyScope 应该是单例吗?
CoroutineScope 定义了一个范围,您可以在其中包含、界定和跟踪所有并发操作,并将它们与应用程序实体的生命周期联系起来。
我打算通过我创建的自定义范围 CryptographyScope
调用 decrypt
。但是,这是不对的,因为我没有任何具有定义生命周期的实体,因此无法避免泄漏的发生。
正确的做法是:
fun decryptAll() = coroutineScope {
async {
cryptographyService.decrypt(value1)
}
async {
cryptographyService.decrypt(value2)
}
}
GlobalScope.launch {} 在 'global' 作用域中启动一个新协程,而 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")
}
在上面的代码片段中,第 4 行只会在 runBlocking {} 中定义的两个协程都已完成时执行。
现在尝试 运行 与 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 中的协程没有完成,这一行也会执行。
但是,上述示例中启动的协程 运行 在单独的 'global' 范围内,runBlocking 无法控制该范围。
假设我有一个名为 CryptographyScope
的协程作用域:
object CryptographyScope : CoroutineScope {
override val coroutineContext: CoroutineContext =
Dispatchers.IO + CoroutineName("CryptographyScope")
}
因此,在我的应用程序的许多地方我都调用了 CryptographyScope.async
。
CryptographyScope.async {
cryptographyService.decrypt(value)
}
当
cryptographyService.decrypt(value)
之一失败并抛出异常时会发生什么?它是否会在执行时取消应用程序中使用CryptographyScope
的每个协程?CryptographyScope 应该是单例吗?
CoroutineScope 定义了一个范围,您可以在其中包含、界定和跟踪所有并发操作,并将它们与应用程序实体的生命周期联系起来。
我打算通过我创建的自定义范围 CryptographyScope
调用 decrypt
。但是,这是不对的,因为我没有任何具有定义生命周期的实体,因此无法避免泄漏的发生。
正确的做法是:
fun decryptAll() = coroutineScope {
async {
cryptographyService.decrypt(value1)
}
async {
cryptographyService.decrypt(value2)
}
}
GlobalScope.launch {} 在 'global' 作用域中启动一个新协程,而 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")
}
在上面的代码片段中,第 4 行只会在 runBlocking {} 中定义的两个协程都已完成时执行。
现在尝试 运行 与 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 中的协程没有完成,这一行也会执行。
但是,上述示例中启动的协程 运行 在单独的 'global' 范围内,runBlocking 无法控制该范围。