scala - cats/fs2 相当于 ScheduledExecutorService.scheduleWithFixedDelay 是什么

标签 scala scala-cats fs2 cats-effect

我找到了fs2-cron但它与调用具有固定延迟间隔的任务不同。如果 cats/fs2 中提供此功能,您能否提供代码示例。我确实看过猫计时器,但不知道如何以间隔重复该任务。

一种方法如下,但我认为添加 Thread.sleep 不是正确的方法。

Stream.eval(IO {
  println("BEING RUN!!");
  Thread.sleep(5000)
})
  .repeat
  .compile
  .drain
  .as(ExitCode.Success)

谢谢 萨阿德。

最佳答案

使用 Thread.sleep 并不是引入延迟的最佳方法,因为它会阻塞线程 5 秒。

通常,更好的替代方案是使用 IO.sleep,它不会阻塞线程,只是在给定的时间段内“挂起”任务,然后再次重新安排它。

Stream.eval(
  for {
    _ <- IO(println("BEING RUN!!"))
    _ <- IO.sleep(5.seconds)
  } yield ()
).repeat
  .compile
  .drain
  .as(ExitCode.Success)

更好的是,您可以使用 fs2 内置函数 awakeEvery 以固定间隔从流中发出单个元素,然后对流的每个元素执行效果.

Stream.awakeEvery[IO](5.seconds)
    .evalMap(_ => IO(println("BEING RUN!!")))
    .compile
    .drain
    .as(ExitCode.Success)

关于scala - cats/fs2 相当于 ScheduledExecutorService.scheduleWithFixedDelay 是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66739628/

相关文章:

scala - 在自由 monad 中使用 Either

scala - 为 fs2.Stream 的所有元素同时安排计算

scala - 如何推理 Scala Cats/fs2 中的堆栈安全?

scala - fs2.Stream[IO, Something] 不返回 take(1)

java - SetFontSize 在 JRDesignStyle 中已弃用

algorithm - Scala 树/图实现

斯卡拉,猫。有人可以解释什么是 `F` 以及它从何而来?

circe - object circe 不是包 io 的成员

scala - SBT:更新项目引用

启用 DefaultTyping 时,Scala 枚举序列化使用 Jackson 失败