gpt4 book ai didi

Kotlin Coroutines - 使用 Coroutine Scope/Context 的不同选项?

转载 作者:行者123 更新时间:2023-12-02 12:53:38 25 4
gpt4 key购买 nike

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

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

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

选项 2 是通过实现 CoroutineScope类中的接口(interface),覆盖 CoroutineContext ,然后您可以使用 launch 轻松启动协程或 async :
@Service
class ServiceImpl() : CoroutineScope {

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

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

我目前正在开发一个后端端点,它将执行以下操作:
  • 接受请求
  • 将请求上下文保存到数据库
  • 在后台启动一个非阻塞协程对请求执行昂贵/冗长的操作,并立即返回 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.3Kotlin .

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

    最佳答案

    我会推荐选项 2。它会让你有机会清楚地定义父 Job对于你所有的协程。这也提供了一个正确关闭整个执行的机会。
    还有几个协程上下文键要包括 - CoroutineName , CoroutineExceptionHandler等等。
    最后,如果您通过 CoroutineScope,结构并发可能会更好地工作。以及明确的关联作业。
    https://medium.com/@elizarov/structured-concurrency-722d765aa952
    另外,看看 Roman 的解释:
    https://medium.com/@elizarov/coroutine-context-and-scope-c8b255d59055

    关于Kotlin Coroutines - 使用 Coroutine Scope/Context 的不同选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55174642/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com