gpt4 book ai didi

kotlin - "coroutine local"kotlin 中的变量

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

Java 有 ThreadLocal 变量,可以很好地运行并行操作,而无需踩到其他线程或每个循环分配,例如 OpenCV 使用 videoCapture.retrieve(image) ,并且“图像”可以是线程局部变量。

Kotlin 对“协程局部”变量有任何意义吗?如果我想以他们的反例为例,但每个协程都有一个计数器,我该怎么做?

for (i in 1..1_000_000)
thread(start = true) {
c.addAndGet(i)
}

最佳答案

如果您正在寻找 ThreadLocal 作为性能优化,以确保每个线程都获得它自己的某个临时对象的副本,那么您应该继续为此目的使用 ThreadLocal。协程可能比线程多得多,并且为每个协程保留一些临时对象的副本可能弊大于利。

如果您正在寻找 ThreadLocal 作为在方法调用周围传递一些上下文的一种方式,那么我强烈建议考虑将此上下文显式传递到您的函数中或使用一些依赖注入(inject)框架来做到这一点。

如果您确实需要传递一些上下文,但由于某些技术原因,您不能显式传递它,也不能使用 DI(即您将在线程中使用 ThreadLocal),您可以在协程中使用 CoroutineContext .步骤是:

使用以下模板定义您自己的协程上下文元素类:

class MyContextElement : AbstractCoroutineContextElement(MyContextElement) {
companion object Key : CoroutineContext.Key<MyContextElement>
// you state/code is here
}

创建元素的实例,并在启动协程时将其传递给协程构建器。以下示例使用 launch 协程构建器,但它适用于所有协程构建器( asyncproduceactor 等)
launch(MyContextElement()) {
// the code of your coroutine
}

您可以使用 + 运算符将您的上下文与其他上下文元素组合(有关详细信息,请参阅 "Combining Contexts" in the guide)

从协程代码内部,您始终可以从 coroutineContext 检索您的元素。所有标准构建器都将 CoroutineScope 实例纳入其范围,从而使其 coroutineContext 属性可用。如果您深入到挂起函数的调用堆栈中,那么您可以定义自己的 coroutineContext() 辅助函数来检索当前上下文,直到它在 future 的更新之一中进入标准库。有关详细信息,请参阅 KT-17609

有了 coroutineScope 就可以轻松检索您的元素:
val myElement = coroutineScope[MyContextElement]

关于kotlin - "coroutine local"kotlin 中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46676945/

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