gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 13:13:18 26 4
gpt4 key购买 nike

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

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/

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