等待 Writer.write 在 Caml 异步中完成

Waiting for Writer.write to complete in Caml Async

我有以下简单的 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 unexpectedly closed")。有没有办法在关闭文件描述符之前等待写入完成?实际上,我不明白为什么 Writer.write 不像 Reader.read 那样 return 和 Deferred.t。不就解决问题了吗?

我的问题其实比较笼统。基本上,我有一个周期性的工作,使用 Clock.every' 将一些东西写入文件。该程序可以随时退出并关闭文件描述符。如何确保在 fd 关闭之前处理所有写入?

如果我停止工作是:

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

计划写入很可能发生在 Unix.close fdexit 0 之间。

在您的特定情况下,您不应直接使用 Unix.close 函数关闭文件描述符。这个想法是您实际上将 fd 的所有权移交给了作者,因此现在作者有责任关闭文件描述符。所以,你需要使用 Writer.close 那 return 一个单位延期。此函数将等待所有挂起的写入完成,然后关闭文件描述符,例如

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

回答您更笼统的问题 "Is there a way to wait for write to complete before closing the file descriptor?"。是的,Writer.close 会等待。从这个意义上说,它将 return 一个延迟,它将在所有内容都写完并且 fd 关闭后确定。您还可以使用 force_close 参数,这将强制关闭操作导致突然写入,如果它被认为是挂起程序的更好选择。例如,您可以给程序合理的时间来刷新数据,然后以错误终止。