等待Writer.write在CAML异步完成(Waiting for Writer.write t

2019-09-29 04:29发布

我这是应该写入一个文件,并终止该进程以下简单的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的一部分,是“作家FD意外关闭”)。 有没有办法等待写入关闭文件描述符前完成? 其实,我不明白为什么Writer.write不返回Deferred.t就像Reader.read一样。 那岂不是解决这一问题?

我的问题其实是一个小更普遍。 基本上,我有写东西用文件的定期工作Clock.every' 。 该程序可以在任何时候退出并关闭文件描述符。 如何确保所有的写操作都处理之前fd得到关闭?

如果我停止工作是:

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

一个定时写入之间可以很好地发生Unix.close fdexit 0

Answer 1:

在您的特定情况下,你不应该直接与关闭文件描述符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被关闭后,SENCE。 你也可以使用一个force_close参数,将强制关闭操作导致突然的写操作,如果它认为是一个更好的选择挂程序。 例如,你可以给一个程序的合理时间内刷新数据,然后用一个错误终止。



文章来源: Waiting for Writer.write to complete in Caml Async