ЗИО: Как присоединиться к Fibers для процессов, которые работают вечно

У меня есть следующая программа ZIO с двумя процессами, которые работают вечно:

    for {
      ..
      numberProvider <- numberProvider(queue).fork  // runs forever
      numberService <- numberService(queue)         // runs forever
      ..
    } yield ()

Приведенный выше код работает, но мне было интересно, является ли это хорошей практикой.

Есть 2 вопроса:

  1. Можно ли запустить процесс 2. в основной программе. Или это тоже должно быть волокно?

  2. Должен ли я join Волокна в конце концов, даже если они бегут вечно и, следовательно, никогда не достигают join?

    for {
      ..
      numberProvider <- numberProvider(queue).fork  // runs forever
      numberService <- numberService(queue)         // runs forever
      ..
      _ <- numberProvider.join // join in any case
    } yield ()
    

2 ответа

Решение

Тебе не нужно .join волокно, если они будут работать вечно.

Обратите внимание, что поскольку 1.0.0-RC17, #zio добавил .daemonкомбинатор именно по этой причине, см. примечание к выпуску здесь: https://github.com/zio/zio/releases/tag/v1.0.0-RC17 и с этого момента,.fork следует избегать для вечно текущих волокон.

Из ответа fanf42 я изменил свой код на:

for {
      ..
      numberProvider <- numberProvider(queue).daemon  // runs forever
      numberService <- numberService(queue)           // runs forever
      ..
    } yield ()

Но это не сработало (изменено fork к daemon). До следующей строчки он так и не дошел.

Так что не забудьте fork то daemon также.

for {
      ..
      numberProvider <- numberProvider(queue).daemon.fork  // runs forever
      numberService <- numberService(queue)                // runs forever
      ..
    } yield ()
Другие вопросы по тегам