6

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

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

上面的代码有效,但我想知道这是否是一种好习惯。

有2个问题:

  1. 可以吗,在主程序上运行2.进程。还是应该也是Fiber

  2. join最终是否必须使用 Fibers,即使它们永远运行并因此永远无法到达join

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

2 回答 2

6

如果它们永远运行,你不必.join纤维化。

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

于 2019-12-03T08:33:30.940 回答
1

根据fanf42的回答,我将代码调整为:

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

但这不起作用(更改forkdaemon)。它从未到达下一行。

fork因此,请确保daemon也如此。

for {
      ..
      numberProvider <- numberProvider(queue).daemon.fork  // runs forever
      numberService <- numberService(queue)                // runs forever
      ..
    } yield ()
于 2019-12-16T19:03:22.043 回答