Kotlin:获取当前的CoroutineContext.Key而不访问CoroutineScope吗?

时间:2019-01-17 11:45:19

标签: kotlin kotlin-coroutines

我试图拦截System.out打印语句,并且在多线程程序中,我计划使用CoroutineContext.Key作为地图关键字将这些语句添加到地图中,因此我知道哪个协程输出属于。

正在执行的子方法无权访问CoroutineScope,因为这是从父方法开始的。

我一直希望采用一种CoroutineContext.currentKey的静态方法,但这看起来并不存在。

我使用他们的Task.CurrentId

在C#中也达到了类似的目的

我有什么办法实现这一目标吗?

谢谢

1 个答案:

答案 0 :(得分:0)

您可以创建自己的线程局部变量,以保留自己的协程标识符,甚至直接保留其保存的输出,并使用ThreadLocal.asContextElement()扩展功能将其转换为协程上下文元素。现在,如果您使用此元素启动协程,则此协程在线程之间跳变时,此线程局部变量的指定值将自动安装到相应的线程局部变量中。请参见以下示例代码:

import kotlinx.coroutines.*

val myId = ThreadLocal<String>()

// I'm not a suspending function, yet I know what coroutine I work in
fun whereAmI() {
    println("I'm in coroutine '${myId.get()}'")
}

fun main() = runBlocking<Unit> {
    launch(myId.asContextElement("First")) {
        whereAmI()
    }
    launch(myId.asContextElement("Second")) {
        whereAmI()
    }
}