等待Writer.write在Caml Async中完成

时间:2017-07-17 16:02:24

标签: asynchronous ocaml core

我有以下简单的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 fdexit 0之间可能会发生预定的写入。

1 个答案:

答案 0 :(得分:2)

在您的特定情况下,您不应该使用-- The simplest function that I wrote in Postgresql CREATE FUNCTION TEST_FUNCTION() RETURNS INTEGER STABLE AS $$ return 1 $$ LANGUAGE plpythonu; -- Testing the simplest function SELECT TEST_FUNCTION(); -- Dropping the simplest function out DROP FUNCTION TEST_FUNCTION(); 函数直接关闭文件描述符。这个想法是你实际上将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 会等待。在它将返回一个延迟后,将在所有内容写入并且fd关闭后确定。您还可以使用Writer.close参数,如果它被认为是挂起程序的更好选项,则会强制关闭操作导致突然写入。例如,您可以为程序提供合理的时间来刷新数据,然后以错误终止。