我正在使用管道来通信两个 Prolog 进程,每次我到达read/2
谓词以从我的管道中读取消息时,程序都会阻塞并保持这种状态。我不明白为什么会发生这种情况(我尝试了非常简单的程序),最后我意识到了三件事:
- 每次我
write/2
用来发送消息时,发送者进程都必须以.\n
. 如果消息没有这样结束,接收进程将卡在read/2
谓词上。 - 如果发送方不刷新输出,则消息不会留在管道缓冲区中。这似乎很明显,但一开始并不适合我。
- 虽然当消息没有被刷新时
read/2
是阻塞的,根本不是阻塞的,所以在这种情况下wait_for_input/3
不需要。flush_output/1
例子:
这不起作用:
example1 :-
pipe(R,W),
write(W,hello),
read(R,S). % The program is blocked here.
那个也行不通:
example2 :-
pipe(R,W),
write(W,'hello.\n'),
read(R,S). % The program is blocked here.
虽然这两个,做工作:
example3 :-
pipe(R,W),
write(W,'hello.\n'),
flush_output(W),
read(R,S).
example4 :-
pipe(R,W),
write(W,'hello.\n'),
wait_for_input([W],L,infinite).
现在我的问题是为什么?从管道读取(实际上是从您可能想要读取的任何流中读取)时,Prolog 仅“接受”以句点结尾的整行是否有原因?为什么read
阻塞而不阻塞wait_for_input/3
(假设消息没有被刷新)?
谢谢!