kotlin - 为后端应用程序设置 kotlin 协程范围的正确方法

标签 kotlin kotlinx.coroutines

设置协程范围的正确方法是什么 -

1.实现范围

@Service
class MyServiceImpl : MyService, CoroutineScope {
    private val job: Job = Job()
    override val coroutineContext: CoroutineContext
        get() = job + Executors.newFixedThreadPool(100).asCoroutineDispatcher()
    override fun get(): String {
        launch {....}
        return "Result"
    }}

` 2.没有实现

@Service
class MyServiceImpl : MyService {
    private val scope = Executors.newFixedThreadPool(100).asCoroutineDispatcher()
    override fun get(): String {
        GlobalScope.launch(scope) {....}
        return "Result"
    }}

或者只是在没有任何上下文的情况下使用 GlobalScope?

最佳答案

没有正确的方法,这三种变体在不同的场景下都有用。

  1. 实现自己的协程作用域: 如果协程的生命周期取决于另一个对象的生命周期。在 UI 应用程序中特别有用,例如Android,如果你需要销毁所有挂起的协程,当启动事件被销毁时,参见https://github.com/Kotlin/kotlinx.coroutines/blob/master/ui/coroutines-guide-ui.md#structured-concurrency-lifecycle-and-coroutine-parent-child-hierarchy .
  2. 从线程池创建作用域:如果您的协程应该在公共(public)线程池中运行。在这种情况下,新协程的生命周期不依赖于这个范围,而是依赖于外部协程:

    val fixedThreadPoolContext = newFixedThreadPoolContext(100, "background")
    launch(Dispatchers.Main) {
        withContext(fixedThreadPoolContext) {
            //parent job is from the outer coroutine
        }
        //or
        val asyncResult = async(fixedThreadPoolContext) {
            //parent job is from the outer coroutine
        }
    }
    
  3. 使用全局作用域:如果你喜欢启动一些不依赖于任何其他对象的后台协程。通常最好提供一个绑定(bind)到您的应用程序对象或某些全局单例的自己的范围。然后你可以提供自己的异常处理器等

对于后端服务,我会使用自己的全局线程池调度程序然后您可以控制大小。请注意,GlobalScope 使用 CPU 计数作为参数来定义池大小。这对于 CPU 受限任务非常有用,但对于 IO 任务(如数据库访问)则不然。

关于kotlin - 为后端应用程序设置 kotlin 协程范围的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53215233/

相关文章:

java - 排序和比较两个列表的最短方法

android - 如何在 Kotlin 中编写一个从 Firestore 返回字符串的方法?

kotlin - 关闭ExecutorCoroutineDispatcher的底层Executor

kotlin - 如何加入 Kotlin 主管工作

Android协程函数回调

java - 地理围栏在 Kotlin 中不起作用

java - 在 Kotlin 中使用 Mockito 抛出异常

android - LazyColumn 中每个项目的状态提升

android - 如何将 Android 任务转换为 Kotlin Deferred?

android - await 是否阻塞了 Android 上的 UI 线程?