ЗИО: Как присоединиться к Fibers для процессов, которые работают вечно
У меня есть следующая программа ZIO с двумя процессами, которые работают вечно:
for {
..
numberProvider <- numberProvider(queue).fork // runs forever
numberService <- numberService(queue) // runs forever
..
} yield ()
Приведенный выше код работает, но мне было интересно, является ли это хорошей практикой.
Есть 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 ()