ZIO:如何为永久运行的进程加入光纤



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

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

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

有两个问题:

  1. 是否可以,在主程序上运行 2. 进程。或者它也应该是一种纤维

  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

fanf42的答案中,我将代码调整为:

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

但这不起作用(fork更改为daemon(。它从未到达下一行。

因此,请务必forkdaemon

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

最新更新