How do you flush the io buffer in Erlang?For instance:
> io:format("hello"), > io:format(user, "hello").
This post seems to indicate that there is no clean solution.Is there a better solution than in that post?
ggazkfy81#
可悲的是,除了在io/内核子系统中正确地实现一个flush“命令”* 和 * 确保实现实际io的低级驱动程序支持这样一个命令之外,你真的必须在关闭之前简单地依赖系统停顿。我认为这是一个失败。请查看stdlib中的io.erl/io_lib.erl和内核中的file_io_server.erl/prim_file.erl,以了解详细信息。例如,在file_io_server(它有效地从io/io_lib获取请求并将其路由到正确的驱动程序)中,命令类型为:
{put_chars,Chars} {get_until,...} {get_chars,...} {get_line,...} {setopts, ...}
(i.e.不冲水)!当然,作为一种替代方法,你可以在每次写操作后总是关闭输出(这将强制刷新)。我的一个日志模块每次都执行类似的操作,而且它看起来并不那么慢(它是一个gen_server,通过cast消息接收日志):
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);
q9rjltbz2#
io:put_chars(<<>>)
在剧本的最后一句对我很管用。
b4lqfgs43#
你可以跑
flush().
或尝试
flush()-> receive _ -> flush() after 0 -> ok end.
这跟同花C差不多。
3条答案
按热度按时间ggazkfy81#
可悲的是,除了在io/内核子系统中正确地实现一个flush“命令”* 和 * 确保实现实际io的低级驱动程序支持这样一个命令之外,你真的必须在关闭之前简单地依赖系统停顿。我认为这是一个失败。
请查看stdlib中的io.erl/io_lib.erl和内核中的file_io_server.erl/prim_file.erl,以了解详细信息。
例如,在file_io_server(它有效地从io/io_lib获取请求并将其路由到正确的驱动程序)中,命令类型为:
(i.e.不冲水)!
当然,作为一种替代方法,你可以在每次写操作后总是关闭输出(这将强制刷新)。我的一个日志模块每次都执行类似的操作,而且它看起来并不那么慢(它是一个gen_server,通过cast消息接收日志):
q9rjltbz2#
在剧本的最后一句对我很管用。
b4lqfgs43#
你可以跑
或尝试
这跟同花C差不多。