Как получить идентификатор выполняющегося в данный момент волокна ZIO из побочного кода

Я знаю, что могу получить идентификатор текущего выполняющегося волокна, позвонив

ZIO.descriptor.map(_.id)

Однако то, что я хочу, - это нечистая функция, которую я могу вызвать из кода побочного эффекта, давайте определим ее как

def getCurrentFiberId(): Option[FiberId]

так что

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

дает истину. Можно ли определить такую ​​функцию, и если да, то как? Обратите внимание, что этот вопрос тесно связан с Как получить доступ к локальным данным волокна из побочного кода в ZIO.


person Matthias Langer    schedule 28.07.2019    source источник


Ответы (1)


Невозможно. Эта информация содержится в экземпляре класса FiberContext, который фактически является ядром ZIO Runtime, отвечающим за интерпретацию эффектов.

Кроме того, такой класс является внутренней реализацией и по понятным причинам является частным пакетом.

Кроме того, для него существует не только один экземпляр, но и один для каждого unsafeRun эффекта и еще один каждый раз, когда fork интерпретируется.

Поскольку выполнение эффекта не привязано к потоку, ThreadLocal не используется, и поэтому нет никакой надежды на извлечение этой информации так, как вы хотите.

person Alejandro Navas    schedule 21.04.2020