1

gen_server实现具有这个有趣的小功能

do_send(Dest, Msg) ->
    case catch erlang:send(Dest, Msg, [noconnect]) of
        noconnect ->
            spawn(erlang, send, [Dest,Msg]);
        Other ->
            Other
    end.

选项的条目erlang:send/3noconnect

如果在发送之前必须自动连接目标节点,则返回 noconnect。

这里的函数通过强制生成的进程进行等待来避免在节点之间建立连接的延迟。聪明的!

还有另一种选择erlang:send/3nosuspend

如果发送者必须被挂起才能进行发送,则返回 nosuspend。

每,erlang:send_nosuspend/2如果连接过载,发送方将被挂起。为什么不gen_server希望使用相同的技巧来避免暂停发送过程呢?

4

1 回答 1

2

Dest在另一个 erlang 节点上时执行此操作。如果节点未连接,它首先尝试发送消息而不强制建立连接,该[noconnect]选项。如果可以做到这一点,则erlang:send/3发送消息。如果这不能完成,那么我们会生成一个进程,该进程执行等待连接建立的发送。在两个节点之间建立连接可能需要一些时间。当然,这是因为我们不会坐在那里不必要地等待发送。

编辑: 根本gen_server不处理这种nosuspend情况,它只是担心由于需要等待建立连接而向远程进程发送消息可能需要时间的情况。在这种情况下,会产生一个进程,以便我们继续。这不会改变语义。对nosuspend最终的网络问题进行了更复杂的处理,这可能需要比标准 API 中提供的更复杂的处理。

于 2013-10-12T16:59:57.267 回答