代码之家  ›  专栏  ›  技术社区  ›  Nemo

正在等待作者。在Caml异步中写入以完成

  •  1
  • Nemo  · 技术社区  · 8 年前

    我有以下简单的OCaml异步作业,它应该写入文件并终止进程。

    Unix.openfile "foobar" ~mode:[`Creat;`Rdwr]
    >>= fun fd ->
    let wr = Writer.create fd in
    Writer.write wr "this is a test";
    Unix.close fd
    >>= fun () ->
    exit 0
    

    fd 在执行写入之前关闭(显示的sexp的一部分是“writer fd意外关闭”)。有没有办法在关闭文件描述符之前等待写入完成?事实上,我不明白为什么 Writer.write 不返回 Deferred.t Reader.read

    我的问题实际上更一般一些。基本上,我有一个定期的工作,使用 Clock.every' 。程序可以随时退出并关闭文件描述符。如何确保在 fd公司 关门?

    Unix.close fd
    >>= fun () ->
    exit 0
    

    计划写入很可能发生在 Unix.close fd exit 0 .

    1 回复  |  直到 8 年前
        1
  •  2
  •   ivg    8 年前

    在您的特定情况下,不应该直接用 Unix.close 作用这个想法是你实际上转移了 fd Writer.close 返回延迟的单位。此函数将等待所有挂起的写入完成,然后关闭文件描述符,例如。,

    Unix.openfile "foobar" ~mode:[`Creat;`Rdwr]
    >>= fun fd ->
    let wr = Writer.create fd in
    Writer.write wr "this is a test";
    Writer.close fd
    >>= fun () ->
    exit 0
    

    Writer.close 将等待。在这种情况下,它将返回一个延迟,该延迟将在写入所有内容并关闭fd后确定。您也可以使用 force_close