在 Caml Async 中等待 Writer.write 完成

问题描述 投票:0回答:1

我有以下简单的 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
之间。

asynchronous ocaml
1个回答
3
投票

在您的特定情况下,您不应直接使用

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
参数,如果它被认为是挂起程序的更好选择,它将强制关闭操作导致突然写入。例如,您可以给程序一段合理的时间来刷新数据,然后因错误而终止。

© www.soinside.com 2019 - 2024. All rights reserved.