我知道我可以通过调用来获取当前正在执行的光纤的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密切相关。
答案 0 :(得分:0)
不可能。该信息包含在名为FiberContext
的类的实例中,该类实际上是ZIO Runtime
的核心,负责解释效果。
此外,此类是内部实现,可以理解为私有包。
此外,不仅有一个实例,而且每次您unsafeRun
效果一个,每个实例fork
被解释一个。
由于效果的执行未绑定到线程,因此不使用ThreadLocal
,因此,不希望以某种方式提取所需信息。