Kotlin 协程 - 使用协程作用域/上下文的不同选项?

2024-03-28

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

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

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

选项 2 是通过实施CoroutineScope类中的接口,覆盖CoroutineContext,然后你可以轻松地启动协程launch or async:

@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 of Kotlin.

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


我会推荐选项 2。它会让你有机会清楚地定义父级Job对于所有的协程。这也提供了正确关闭整个执行的机会。

还有几个协程上下文键需要包含 -CoroutineName, CoroutineExceptionHandler等等。

最后,如果你通过CoroutineScope以及明确关联的作业。
https://medium.com/@elizarov/structured-concurrency-722d765aa952 https://medium.com/@elizarov/structured-concurrency-722d765aa952

另外,看看Roman对此的解释:https://medium.com/@elizarov/coroutine-context-and-scope-c8b255d59055 https://medium.com/@elizarov/coroutine-context-and-scope-c8b255d59055

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kotlin 协程 - 使用协程作用域/上下文的不同选项? 的相关文章

随机推荐