2016-07-12 24 views

回答

9

兩個函數啓動新gen_server實例作爲調用進程的孩子,但他們的區別在於gen_server:start_link/3,4原子開始gen_server孩子它鏈接到它的父過程。鏈接意味着如果孩子死亡,家長默認也會死亡。 Supervisors是父進程,它們使用鏈接在其子進程異常退出時執行特定的操作,通常會重新啓動它們。

除了在gen_server:start_link案件中涉及的鏈接之外,這些調用中不涉及多進程方面。不管您是使用gen_server:start還是使用gen_server:start_link來啓動新的gen_server,新進程都有一個消息隊列,並且它一次接收並處理這些消息。沒有任何關於gen_server:start_link導致新的gen_server進程的行爲或執行方式與以gen_server:start開始的行爲不同。

+0

請看編輯Steve。 –

+1

我已經回答了您的修改內容。如果多個進程同時調用你的'gen_server',它們的消息在'gen_server'消息隊列中排隊,'gen_server'則一次處理這些消息。 –

4

當您使用gen_server:start_link新過程成爲調用過程的「子」 - 它是監督樹的一部分。它允許在gen_server進程死亡的情況下通知進程。

使用gen_server:start會在監督樹之外產生進程。

二郎監督尼斯的描述是在這裏:http://learnyousomeerlang.com/supervisors

+0

如果我的genserver是從多個線程調用的,它會一次執行它們嗎?或者它會在這些線程之間創建併發性? –

+0

謝謝你的回答,你能回答我嗎? –

+4

Erlang不使用術語「線程」。它被稱爲「過程」。如果多個進程調用相同的gen_server,則他們的請求將被放入隊列中並逐個處理。在http://learnyousomeerlang.com/content上有關於OTP的非常好的部分 – Novakov