sách gpt4 ai đã đi

Kotlin Coroutines - Các tùy chọn khác nhau để sử dụng Coroutine Scope/Context?

In lại 作者:行者123 更新时间:2023-12-02 12:53:38 25 4
mua khóa gpt4 Nike

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

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

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

选项 2 是通过实现 CoroutineScope类中的接口(interface),覆盖 CoroutineContext ,然后您可以使用 launch 轻松启动协程或 không đồng bộ :
@Dịch vụ
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.3của Kotlin .

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

    1 Câu trả lời

    我会推荐选项 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
    行者123
    Hồ sơ cá nhân

    Tôi là một lập trình viên xuất sắc, rất giỏi!

    Nhận phiếu giảm giá Didi Taxi miễn phí
    Mã giảm giá Didi Taxi
    Giấy chứng nhận ICP Bắc Kinh số 000000
    Hợp tác quảng cáo: 1813099741@qq.com 6ren.com