我有以下简单的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
之间可能会发生预定的写入。
答案 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
参数,如果它被认为是挂起程序的更好选项,则会强制关闭操作导致突然写入。例如,您可以为程序提供合理的时间来刷新数据,然后以错误终止。