ZIO:如何为永远 运行 的进程加入 Fibers

ZIO: How to join Fibers for Processes that run forever

我有以下 ZIO 程序,其中有两个进程都 运行 永远:

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

以上代码有效,但我想知道这是否是好的做法。

有2个问题:

  1. 可以吗,到运行2.主程序上处理。或者它也应该是 Fiber?

  2. 我是否必须最终 join 光纤,即使它们永远 运行 因此永远不会到达 join

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

如果他们 运行 永远,您就不必 .join 光纤。

请注意,由于 1.0.0-RC17,#zio 正是出于这个原因添加了 .daemon 组合器,请参阅此处的发行说明:https://github.com/zio/zio/releases/tag/v1.0.0-RC17 从现在开始,.fork应该避免 forever-运行ning 光纤。

根据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 ()