Kotlin 如何从非挂起函数获取当前“coroutineContext”?

Kotlin 如何从非挂起函数获取当前“coroutineContext”?,kotlin,kotlinx.coroutines,kotlin-coroutines,Kotlin,Kotlinx.coroutines,Kotlin Coroutines,假设我有一个日志功能: fun log(message: String) 不幸的是,这个函数将同时从协程和在协程之外调用。对于协同路由,我想记录来自协同路由上下文的附加信息(例如,协同路由的名称) 我怎样才能做到这一点 这些是我的想法,但我没有解决办法: 不知何故,在log中找出它是否在协同程序中,并获取coroutineContext。这可能吗 我可以有两个版本的log,例如log和logSuspend。但是,我如何确保正确的人被呼叫?如果我在suspend内,没有任何东西可以阻止我意外调

假设我有一个日志功能:

fun log(message: String)
不幸的是,这个函数将同时从协程和在协程之外调用。对于协同路由,我想记录来自协同路由上下文的附加信息(例如,协同路由的名称)

我怎样才能做到这一点

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

  • 不知何故,在
    log
    中找出它是否在协同程序中,并获取
    coroutineContext
    。这可能吗
  • 我可以有两个版本的
    log
    ,例如
    log
    logSuspend
    。但是,我如何确保正确的人被呼叫?如果我在
    suspend
    内,没有任何东西可以阻止我意外调用
    log
    。此外,我可能有一个常规的助手函数。应该叫哪一个
  • 可能是带有
    ThreadLocal
    的东西,例如,我可以在
    ThreadLocal
    中的
    coroutineContext
    ,但如何确保它保持最新
不知何故,找出日志的内部,如果它在一个协同程序中,并获取 协同文本。这可能吗

我认为没有一个好的解决办法

我将创建两个
log
函数,第一个用于一般用途,第二个是
CoroutineScope
上的一个扩展函数,用于coroutines:

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

fun CoroutineScope.log(message: String) {
    //here you can access coroutineContext
}
如果您从协同程序调用
log
函数,如下所示:

GlobalScope.launch {
    log("CoroutineScope.log")
}
将调用扩展函数,您将可以访问coroutineContext

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

不知何故,找出日志的内部,如果它在一个协同程序中,并获取 协同文本。这可能吗

我认为没有一个好的解决办法

我将创建两个
log
函数,第一个用于一般用途,第二个是
CoroutineScope
上的一个扩展函数,用于coroutines:

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

fun CoroutineScope.log(message: String) {
    //here you can access coroutineContext
}
如果您从协同程序调用
log
函数,如下所示:

GlobalScope.launch {
    log("CoroutineScope.log")
}
将调用扩展函数,您将可以访问coroutineContext

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