我试图拦截System.out打印语句,并且在多线程程序中,我计划使用CoroutineContext.Key
作为地图关键字将这些语句添加到地图中,因此我知道哪个协程输出属于。
正在执行的子方法无权访问CoroutineScope
,因为这是从父方法开始的。
我一直希望采用一种CoroutineContext.currentKey
的静态方法,但这看起来并不存在。
我使用他们的Task.CurrentId
我有什么办法实现这一目标吗?
谢谢
答案 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()
}
}