如何在Erlang中刷新io缓冲区?

Nat*_*ray 5 erlang buffer input flush

你如何在Erlang中刷新io缓冲区?

对于实例:

io:format("hello") 要么 io:format(user, "hello")

这篇文章似乎表明没有干净的解决方案.

有没有比那篇文章更好的解决方案?

Ala*_*ore 5

遗憾的是,除了在io /内核子系统中正确实现刷新"命令" 确保实现实际io的低级驱动程序支持这样的命令之外,您必须在关闭之前简单地依赖系统静默.我觉得失败了.

看看io.erl/io_lib.erl在STDLIB和file_io_server.erl/prim_file.erl内核的血淋淋的细节.

例如,在file_io_server(它有效地从io/io_lib获取请求并将其路由到正确的驱动程序),命令类型是:

{put_chars,Chars}
{get_until,...}
{get_chars,...}
{get_line,...}
{setopts, ...}
Run Code Online (Sandbox Code Playgroud)

(即没有冲洗)!

作为替代方案,您当然可以在每次写入后关闭输出(这将强制刷新).我每次都有这样的记录模块,它看起来并不那么慢(它是通过强制转换消息收到日志的gen_server):

  case file:open(LogFile, [append]) of
    {ok, IODevice} ->
    io:fwrite(IODevice, "~n~2..0B ~2..0B ~4..0B, ~2..0B:~2..0B:~2..0B: ~-8s : ~-20s : ~12w : ",
          [Day, Month, Year, Hour, Minute, Second, Priority, Module, Pid]),
    io:fwrite(IODevice, Msg, Params),
    io:fwrite(IODevice, "~c", [13]),
    file:close(IODevice);
Run Code Online (Sandbox Code Playgroud)