如何在OCaml中安排任务?

Jac*_*ale 1 ocaml

我有一项任务需要每4小时或每天执行一次。

在Java中,它具有quartzspringtimer

但是在OCaml中,我该怎么做?有什么好的lib吗?

Chr*_*Lec 5

我不知道有任何库可以做到这一点,但是我认为您可以使用Lwt库轻松实现这种行为。

小例子,每4小时打印一次Hello world:

let rec hello () = 
    Lwt.bind (Lwt_unix.sleep 14400.) 
       (fun () -> print_endline "Hello, world !"; hello ())
Lwt.async (hello)
Run Code Online (Sandbox Code Playgroud)

Lwt.async函数在异步轻量级线程中调用给定的函数(在此,您好),因此您可以在程序中自由地做其他事情。只要您的程序没有退出,“ Hello world”将每4小时打印一次。

如果您希望能够停止它,也可以像这样启动线程而不是Lwt.async:

let a = hello ()
Run Code Online (Sandbox Code Playgroud)

然后,停止线程:

Lwt.cancel a
Run Code Online (Sandbox Code Playgroud)

请注意,Lwt.cancel会引发“ Lwt.canceled”异常!

然后,为了能够在一天的特定时间启动任务,我只能鼓励您使用Unix模块中的函数,例如localtime和mktime。

  • 是的,您必须保持程序运行,否则轻量线程将与主线程一起消失。通过执行“ let _ = start()”,您说的是“好的,只需启动一个将执行start的线程,然后执行下一条指令”,但是由于没有下一条指令,因此程序退出了。通过将`let _ = start()`替换为`let _ = Lwt.bind(start())(Lwt.return)`,可以告诉程序等待启动结束(永远不会)。您也可以使用Lwt.wait无限期地等待:`Lwt.bind(fst(Lwt.wait()))Lwt.return` (3认同)
  • 这将永远运行,这不像cron:程序未运行的地方。在这种情况下,您的程序是一个后台驻留的守护程序,对于cron,您的程序将执行一些工作,然后死掉。 (2认同)