gen_server
实施有这个有趣little function:
do_send(Dest, Msg) ->
case catch erlang:send(Dest, Msg, [noconnect]) of
noconnect ->
spawn(erlang, send, [Dest,Msg]);
Other ->
Other
end.
erlang:send/3
条目代表noconnect
选项
如果在执行发送之前必须自动连接目标节点,则会返回noconnect。
此处的功能通过强制生成的进程进行等待来避免在节点之间建立连接的延迟。聪明!
“erlang:send/3
,nosuspend
还有另一种选择:
如果必须暂停发送方以执行发送,则会返回nosuspend。
Per,erlang:send_nosuspend/2
如果连接超载,发件人将被暂停。为什么gen_server
不希望采用相同的技巧来避免暂停发送过程?
答案 0 :(得分:2)
当Dest
在另一个erlang节点上时,它会这样做。它首先尝试在没有的情况下发送消息,如果节点未连接,则强制建立连接[noconnect]
选项。如果可以,则erlang:send/3
发送消息。如果无法做到这一点,那么我们会生成一个进程,该进程执行一个等待建立连接的发送。在两个节点之间建立连接可能需要一些时间。当然,这是因为我们不会坐下来等待发送。
修改强>
gen_server
根本不处理nosuspend
的情况,它只是担心向远程进程发送消息需要花费时间的情况,因为需要等待建立连接。在这种情况下,产生了一个过程,所以我们可以继续。这不会改变语义。 nosuspend
对最终的网络问题进行了更复杂的处理,这可能需要比标准API中提供的更复杂的处理。