【问题标题】:Kotlin Coroutines - Different options for using Coroutine Scope/Context?Kotlin Coroutines - 使用 Coroutine Scope/Context 的不同选项?
【发布时间】:2019-08-06 01:31:22
【问题描述】:

我是 Kotlin/Coroutines 的新手,我注意到使用 CoroutineScope 的两种不同方式。

选项1如下,在任何函数中:

CoroutineScope(Dispatchers.Default).launch { 
    expensiveOperation() 
}

选项 2 是在你的类中实现CoroutineScope 接口,覆盖CoroutineContext,然后你可以使用launchasync 轻松启动协程:

@Service
class ServiceImpl() : CoroutineScope {

    override val coroutineContext: CoroutineContext
        get() = Dispatchers.Default + Job()

    fun someFunction() {
        launch {
            expensiveOperation()
        }
    }
}

我目前正在开发一个后端端点,它将执行以下操作:

  1. 接受请求
  2. 将请求上下文保存到数据库中
  3. 在后台启动一个非阻塞协程对请求执行昂贵/冗长的操作,并立即返回一个http 200。(本质上,一旦我们保存了上下文,我们就可以返回响应并让请求处理背景)

这两个用例有什么区别,对于这种情况,获取CoroutineScope 的首选方法是什么?

这个端点每秒可能会收到多个请求,而冗长的操作需要一两分钟,所以肯定会有多个请求同时处理,来自不同的请求。

另外,如果是选项 2,我是否要将范围/上下文传递给执行繁重处理的函数?或者那是不必要的?例如:

类 ServiceImpl() : CoroutineScope {

override val coroutineContext: CoroutineContext
    get() = Dispatchers.Default + Job()

fun someFunction() {
    launch {
        expensiveOperation(CoroutineScope(coroutineContext))
    }
}

private fun expensiveOperation(scope: CoroutineScope) 
    {
        // perform expensive operation
    }

}

这是一个 Spring Boot 应用,我使用的是 1.3 版本 Kotlin

如果您对如何最好地构建此服务类有任何想法/建议,请告诉我。谢谢

【问题讨论】:

    标签: kotlin kotlin-coroutines


    【解决方案1】:

    我会推荐选项 2。它会让你有机会为你的所有协程明确定义父 Job。这也提供了一个正确关闭整个执行的机会。

    还有几个协程上下文键要包括 - CoroutineNameCoroutineExceptionHandler 等等。

    最后,如果您显式传递 CoroutineScope 和关联的 Job,结构并发可能会更好地工作。
    https://medium.com/@elizarov/structured-concurrency-722d765aa952

    另外,看看那个表格 Roman 的解释: https://medium.com/@elizarov/coroutine-context-and-scope-c8b255d59055

    【讨论】:

    • 谢谢 - 我开始对它有了更好的理解,但我不能说我现在完全掌握了一切。另一个可能有帮助的问题 - 如果我同时处理多个请求,并且其中一个失败最终对 CoroutineScope 来说是致命的,那么其他进程是否会因该故障的任何后果而隔离?还是他们都会受到影响而死亡?我应该将此类设置为prototype bean,因此当控制器转发请求时,每个请求都由创建单独 CoroutineScopes 的独立对象处理?
    猜你喜欢
    • 2019-11-28
    • 1970-01-01
    • 2021-05-05
    • 2019-09-02
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 2023-01-23
    • 1970-01-01
    相关资源
    最近更新 更多