2014-04-09 41 views

回答

15

有一些細微差別:

  • 顯然,gen_server處理中handle_cast鑄件和 「正常」 的消息在handle_info
  • 演員永遠不會失敗;它總是返回ok。如果發送消息給當前未被進程註冊的原子,則發送帶有!的消息將失敗,並返回badarg。 (即使進程已經停止,向pid發送消息也不會導致錯誤。)
  • 如果gen_server正在當前未連接到本地節點的遠程節點上運行,那麼gen_server:cast會產生一個後臺進程建立連接併發送消息,並立即返回,而!僅在連接建立時返回。 (請參閱gen_server:do_send的編碼。)

至於什麼時候選擇其中之一,主要是品味問題。我想說如果消息可以被認爲是gen_server的異步API函數,那麼它應該使用cast,在gen_server回調模塊中具有特定的API函數。也就是說,而不是調用gen_server:cast直接,就像這樣:

gen_server:cast(foo_proc, {some_message, 42}) 

進行函數調用:

foo_proc:some_message(42) 

和實施類似上面直接鑄造該功能。它將gen_server的特定協議封裝在自己的模塊中。

在我看來,「簡單」消息將用於事件,而不是API調用。一個例子是監視器消息,{'DOWN', Ref, process, Id, Reason},以及可能在系統中發生的類似事件。

4

除了legoscia發佈,我會說跟蹤消息比追蹤專用函數API更容易。特別是在產品環境中。

相關問題