2015-02-17 26 views
2

消息是否進入「/ dev/null」?這就是我希望會發生的事情。當我將消息發送到Erlang的一個已停止的進程時會發生什麼?

似乎是!如果第一個操作數是pid,而不是原子,操作員不會告訴發件人收件人已經死亡。我想這不會有用,因爲收件人可能會在收到郵件後立即死亡,而發件人也不會了解這一點。

但我覺得發件人應該得到某種錯誤,因爲當第一個操作數是一個原子而不是pid時會發生這種情況。例如。

> register(am_i_defunct, P=spawn_link(fun() -> timer:sleep(3000) end)). 
true 
> am_i_defunct ! herp.              
herp 
> am_i_defunct ! herp. 
** exception error: bad argument 
    in operator !/2 
     called as am_i_defunct ! herp 
> P ! derp. 
derp 
+1

[Erlang消息到不存在的PID]的可能重複(http://stackoverflow.com/questions/28430114/erlang-message-to-non-existent-pid) – 2015-02-17 21:50:38

回答

3

Erlang!運營商相當於erlang:send/2

發送到已知的pid和發送到已註冊的進程(本地,遠程)之間有點區別。後來的情況可以被認爲是whereis(name)和發送的組合。當您嘗試使用原子發送到失敗的進程時,whereis是失敗的一部分。

如果已知pid,則過程是否存在並不重要。 !將立即返回消息並安排它進行異步傳遞。如果進程死了,它會去/dev/null。從概念上講,爲遠程和本地進程提供透明的體驗,不存在進程存在檢查,因爲檢查遠程進程是否存在會導致延遲ping時間。

可以使用monitorlink函數來獲取目標進程失敗的通知。

如果您有興趣同步「呼叫」進行處理,最好考慮使用gen_server行爲,以提供消息傳遞所需的所有必要的包裝異步。

+0

謝謝!似乎一致性,whereis錯誤不應該傳播超出!或發送。好吧。 – allyourcode 2015-02-17 22:05:20

相關問題