如何从副作用代码中获取当前正在执行的ZIO光纤的ID

时间:2019-07-28 13:37:49

标签: scala scalaz-zio

我知道我可以通过调用来获取当前正在执行的光纤的ID

ZIO.descriptor.map(_.id)

但是,我想要的是一个不纯函数,我可以从副作用代码中调用它,让它像这样定义

def getCurrentFiberId(): Option[FiberId]

这样

for {
  fiberId <- ZIO.descriptor.map(_.id)
  maybeId <- UIO(getCurrentFiberId())
} yield maybeId.contains(fiberId)

得出正确的结果。可以定义这样的功能吗?如果可以,如何定义?请注意,这个问题与How to access fiber local data from side-effecting code in ZIO密切相关。

1 个答案:

答案 0 :(得分:0)

不可能。该信息包含在名为FiberContext的类的实例中,该类实际上是ZIO Runtime的核心,负责解释效果。

此外,此类是内部实现,可以理解为私有包。

此外,不仅有一个实例,而且每次您unsafeRun效果一个,每个实例fork被解释一个。

由于效果的执行未绑定到线程,因此不使用ThreadLocal,因此,不希望以某种方式提取所需信息。