如何从非挂起函数获取当前的`coroutineContext`?

问题描述 投票:0回答:1

说我有一个记录功能:

fun log(message: String)

不幸的是,这个函数将从协同程序和协同程序之外调用。在协同程序的情况下,我想记录来自协程上下文的其他信息(例如,协程的名称)。

我怎样才能做到这一点?

这些是我的想法,但我没有解决方案:

  • 以某种方式在log内部弄清楚它是否在协程内并获得coroutineContext。这可能吗?
  • 我可以有两个版本的log,例如loglogSuspend。但是我如何确保调用正确的人?如果我在suspend里面,没有什么能阻止我意外地打电话给log。另外,我可能有一个常规的帮助函数。它应该叫哪一个?
  • 也许与ThreadLocal的东西,例如我可以在coroutineContext内部ThreadLocal,但我如何确保它保持最新?
kotlin kotlinx.coroutines kotlin-coroutines
1个回答
0
投票

如果它在协程内部并获得coroutineContext,以某种方式弄清楚内部日志。这可能吗?

我认为没有一个好的解决方案。

我会创建两个log函数,第一个用于通用,第二个 - 在CoroutineScope上用于协程的扩展函数:

fun log(message: String) {...}

fun CoroutineScope.log(message: String) {
    //here you can access coroutineContext
}

如果你从coroutine调用log函数,如下所示:

GlobalScope.launch {
    log("CoroutineScope.log")
}

将调用扩展函数,您将可以访问coroutineContext。

注意:不建议使用GlobalScope,它仅用于演示目的。

© www.soinside.com 2019 - 2024. All rights reserved.