在Erlang中,消息的发送者通常发送后立即忘记它,继续自己的工作。如果应用程序需要确认消息接收,则必须构建自己的协议(或使用现有的协议)。这有很多很好的理由。
其中之一是大多数时候没有必要握手。消息被忽略的风险越高,接收过程不再存在,或者同时死亡,在这种情况下,发件人几乎没有机会做一些有趣的事情。
另外,握手是阻止动作,所以会对性能产生影响,并且存在死锁的风险。
承认也应该是一个消息,但不应该承认这一个,否则你创建一个永无止境的消息循环。只有应用程序可以知道该做什么(例如使用带有确认的发送),编写这种函数(或使用实现它的行为)非常容易。例如:
send_with_ack(To,Mess,TimeOut,Ack) ->
Ref = make_ref(),
To ! {Mess,self(),Ref},
receive
{Ack,Ref} -> Ack
after Timeout ->
{error,timeout}
end.
receiving_process() ->
...
receive
{Pattern_matching_Mess,From,Ref} ->
do_something(),
From ! {Ack,Ref}, %% Ack for this kind of message is known by the receiver
do_somethingelse();
Mess1 -> do_otherthing()
end,
...
很少的工作,甚至有可能对消息传递的调查委托给一个新的进程 - 不堵检查 - 和使用链接的过程中,迫使发送者的崩溃,如果达到超时。
感谢您分享您的知识。你知道是否有一些文件/书提到最佳实践如何处理这种事情? – OlliP
我最喜欢的信息来源是http://learnyousomeerlang.com/,当你知道你在找什么时,官方文档值得你获取信息。你还有一些书:Francesco Cesarini和Simon Thompson编写的erlang; Erlang和OTP由Martin Logan,Eric Meritt和Richard Carlsson执行。最后,我还喜欢一系列截屏视频 - 由于采用了渐进的方法(kevin smith:实用的截屏视频) – Pascal