Как получить идентификатор текущего выполняющегося волокна ZIO из кода побочных эффектов
Я знаю, что могу узнать идентификатор текущего выполняющегося волокна, позвонив
ZIO.descriptor.map(_.id)
Однако то, что я хочу, - это нечистая функция, которую я могу вызвать из кода с побочными эффектами, давайте определим ее как
def getCurrentFiberId(): Option[FiberId]
так что
for {
fiberId <- ZIO.descriptor.map(_.id)
maybeId <- UIO(getCurrentFiberId())
} yield maybeId.contains(fiberId)
дает истину. Можно ли определить такую функцию, и если да, то как? Обратите внимание, что этот вопрос тесно связан с тем, как получить доступ к локальным данным волокна из побочного кода в ZIO.
0 ответов
Невозможно. Эта информация содержится в экземпляре класса с именемFiberContext
что практически является ядром ZIO Runtime
отвечает за интерпретацию Эффектов.
Кроме того, такой класс является внутренней реализацией и по понятным причинам является закрытым пакетом.
Кроме того, для этого есть не только один экземпляр, но и по одному на каждый раз, когда вы unsafeRun
эффект и еще один каждый раз fork
интерпретируется.
Поскольку выполнение эффекта не привязано к потоку, ThreadLocal
не используется, и поэтому нет никакой надежды извлечь эту информацию так, как вы хотите.