【问题标题】:How to get current `coroutineContext` from a non-suspend function?如何从非挂起函数中获取当前的`coroutineContext`?
【发布时间】:2019-02-13 01:27:19
【问题描述】:

假设我有一个日志记录功能:

fun log(message: String)

不幸的是,这个函数会在协程和协程之外被调用。对于协程,我想记录来自协程上下文的附加信息(例如,协程的名称)。

我怎样才能做到这一点?

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

  • 以某种方式找出log 内部是否在协程内部并获取coroutineContext。这可能吗?
  • 我可以有两个版本的log,例如loglogSuspend。但是我如何确保正确的人被调用?如果我在suspend 内,没有什么能阻止我意外致电log。此外,我可能有一个常规的辅助功能。它应该调用哪一个?
  • 可能是ThreadLocal,例如我可以在某个时候将coroutineContext 放在ThreadLocal 中,但是如何确保它保持最新?

【问题讨论】:

    标签: kotlin kotlinx.coroutines kotlin-coroutines


    【解决方案1】:

    以某种方式找出日志内部是否在协程中并获取 协程上下文。这可能吗?

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

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

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

    如果你像这样从协程调用log 函数:

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

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

    注意:GlobalScope不推荐使用,仅作演示之用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多