什么是猫 / fs2 相当于 ScheduledExecutorService.scheduleWithFixedDelay

问题描述

我发现 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)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...