&引用;“本地协同程序”;kotlin中的变量

&引用;“本地协同程序”;kotlin中的变量,kotlin,coroutine,kotlin-coroutines,Kotlin,Coroutine,Kotlin Coroutines,Java有ThreadLocal变量,可以很好地运行并行操作,而无需执行其他线程或每循环分配,例如OpenCV使用videoCapture.retrieve(image),而“image”可以是ThreadLocal变量 Kotlin对“协程局部”变量有什么感觉吗?如果我想以他们的反示例为例,但每个协同程序都有一个计数器,我将如何做到这一点 for (i in 1..1_000_000) thread(start = true) { c.addAndGet(i) }

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

Kotlin对“协程局部”变量有什么感觉吗?如果我想以他们的反示例为例,但每个协同程序都有一个计数器,我将如何做到这一点

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

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


如果您正在寻找<代码> THealEngest作为一种方法调用上下文的方法,那么我强烈建议考虑将这个上下文显式传递到您的函数中,或者使用一些依赖注入框架来完成。 如果您确实需要传递一些上下文,但由于某些技术原因,您不能显式地传递上下文,也不能使用DI(在这种情况下,您可以将

ThreadLocal
与线程一起使用),那么您可以将
CoroutineContext
与coroutines一起使用。这些步骤是:

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

class MyContextElement : AbstractCoroutineContextElement(MyContextElement) {
    companion object Key : CoroutineContext.Key<MyContextElement>
    // you state/code is here
}
您可以使用
+
运算符将您的上下文与其他上下文元素组合(有关详细信息,请参阅)

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

有了
coroutineScope
,很容易检索元素:

val myElement = coroutineScope[MyContextElement]

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


如果您正在寻找<代码> THealEngest作为一种方法调用上下文的方法,那么我强烈建议考虑将这个上下文显式传递到您的函数中,或者使用一些依赖注入框架来完成。 如果您确实需要传递一些上下文,但由于某些技术原因,您不能显式地传递上下文,也不能使用DI(在这种情况下,您可以将

ThreadLocal
与线程一起使用),那么您可以将
CoroutineContext
与coroutines一起使用。这些步骤是:

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

class MyContextElement : AbstractCoroutineContextElement(MyContextElement) {
    companion object Key : CoroutineContext.Key<MyContextElement>
    // you state/code is here
}
您可以使用
+
运算符将您的上下文与其他上下文元素组合(有关详细信息,请参阅)

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

有了
coroutineScope
,很容易检索元素:

val myElement = coroutineScope[MyContextElement]

如今,对于那些在这个问题上结结巴巴的人来说,语法似乎发生了一些变化:

class MyContextElement : AbstractCoroutineContextElement(MyContextElement), CoroutineContext.Element {
    override val key = Key

    companion object Key : CoroutineContext.Key<KCallScope>

}
类MyContextElement:AbstractCoroutineContextElement(MyContextElement),CoroutineContext.Element{
覆盖val键=键
伴随对象键:CoroutineContext.Key
}

为了成为
CoroutineContext.Key
您现在需要实现
CoroutineContext.Element
,这要求您实现
Key
getter。

对于现在在这个问题上遇到障碍的人,语法似乎有点改变:

class MyContextElement : AbstractCoroutineContextElement(MyContextElement), CoroutineContext.Element {
    override val key = Key

    companion object Key : CoroutineContext.Key<KCallScope>

}
类MyContextElement:AbstractCoroutineContextElement(MyContextElement),CoroutineContext.Element{
覆盖val键=键
伴随对象键:CoroutineContext.Key
}

为了成为
CoroutineContext.Key
您现在需要实现
CoroutineContext.Element
,这要求您实现
Key
getter。

我认为您可以使用
CoroutineContext
:我认为您可以使用
CoroutineContext