Ben*_*n H 1 coroutine kotlin kotlin-coroutines
Java 具有 ThreadLocal 变量,这些变量非常适合运行并行操作,而无需踩踏其他线程或每个循环分配,例如 OpenCV 使用videoCapture.retrieve(image),“图像”可能是线程局部变量。
Kotlin 对“协程本地”变量有任何意义吗?如果我想以他们的反例为例,但每个协程都有一个计数器,我该怎么做?
for (i in 1..1_000_000)
thread(start = true) {
c.addAndGet(i)
}
Run Code Online (Sandbox Code Playgroud)
如果您正在寻找ThreadLocal性能优化,以确保每个线程都获得某个临时对象的自己的副本,那么您应该继续ThreadLocal为此目的使用。协程可能比线程多得多,并且为每个协程保留一些临时对象的副本可能弊大于利。
如果您正在寻找ThreadLocal一种围绕方法调用传递一些上下文的方法,那么我强烈建议考虑将此上下文显式传递到您的函数中或使用某些依赖项注入框架来执行此操作。
如果您确实需要传递一些上下文的罕见情况,但由于某些技术原因,您不能显式传递它,也不能使用 DI(这是您将ThreadLocal与线程一起使用的地方),您可以CoroutineContext与协程一起使用。步骤是:
使用以下模板定义您自己的协程上下文元素类:
class MyContextElement : AbstractCoroutineContextElement(MyContextElement) {
companion object Key : CoroutineContext.Key<MyContextElement>
// you state/code is here
}
Run Code Online (Sandbox Code Playgroud)
创建元素的实例,并在启动协程时将其传递给协程构建器。下面的示例使用launch协同程序制造商,但它与所有这些工作(async,produce,actor等)
launch(MyContextElement()) {
// the code of your coroutine
}
Run Code Online (Sandbox Code Playgroud)
您可以使用+运算符将您的上下文与其他上下文元素相结合(有关详细信息,请参阅指南中的“组合上下文”)
在您的协程代码中,您始终可以从coroutineContext. 所有标准构建器都将CoroutineScope实例带入其作用域,从而使其coroutineContext属性可用。如果您深入了解挂起函数的调用堆栈,那么您可以定义自己的coroutineContext()辅助函数来检索当前上下文,直到它在未来更新之一中进入标准库。有关详细信息,请参阅KT-17609。
使用coroutineScopein hand,很容易检索你的元素:
val myElement = coroutineScope[MyContextElement]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2367 次 |
| 最近记录: |