有人可以解釋gen_server:start()
和gen_server:start_link()
之間有什麼區別嗎?在Erlang中,gen_server:start()和gen_server:start_link()有什麼區別?
我被告知這是關於多線程的東西。
編輯: 如果我的gen_server從多個線程被調用,它會一次執行它們嗎?或者它會在這些線程之間創建併發性?
有人可以解釋gen_server:start()
和gen_server:start_link()
之間有什麼區別嗎?在Erlang中,gen_server:start()和gen_server:start_link()有什麼區別?
我被告知這是關於多線程的東西。
編輯: 如果我的gen_server從多個線程被調用,它會一次執行它們嗎?或者它會在這些線程之間創建併發性?
兩個函數啓動新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
開始的行爲不同。
當您使用gen_server:start_link
新過程成爲調用過程的「子」 - 它是監督樹的一部分。它允許在gen_server進程死亡的情況下通知進程。
使用gen_server:start
會在監督樹之外產生進程。
二郎監督尼斯的描述是在這裏:http://learnyousomeerlang.com/supervisors
如果我的genserver是從多個線程調用的,它會一次執行它們嗎?或者它會在這些線程之間創建併發性? –
謝謝你的回答,你能回答我嗎? –
Erlang不使用術語「線程」。它被稱爲「過程」。如果多個進程調用相同的gen_server,則他們的請求將被放入隊列中並逐個處理。在http://learnyousomeerlang.com/content上有關於OTP的非常好的部分 – Novakov
請看編輯Steve。 –
我已經回答了您的修改內容。如果多個進程同時調用你的'gen_server',它們的消息在'gen_server'消息隊列中排隊,'gen_server'則一次處理這些消息。 –