2012-05-24 54 views

回答

13

每個Erlang進程都維護一個消息隊列。該過程將獲取消息並逐個處理消息。

在您的例子,如果兩個客戶端在同一時間調用gen_server,這些電話將成爲gen_server過程的隊列中的消息,gen_server會處理這些消息一個接一個。所以不必擔心衝突。

但是,如果一個進程必須處理來自其他進程的太多消息,則需要考慮進程的容量並優化設計,否則它將成爲瓶頸。

+0

謝謝!我設法找到問題。事實證明,它根本不是一個併發問題(正如你所指出的那樣),而是它是一個序列化問題。我沒有正確地使用Erlang位串語法來序列化我的數據,所以字節丟失了。 – quanticle

0

gen_server只是按照它們完成的順序處理請求,無論它們是從一個進程還是多個進程完成的。

如果寫入日誌,沒有理由擔心種族條件。

0

幸運的是,對於OTP源是容易獲得在github,但短答案是,在一個循環中gen_server運行時,回答的請求,以便在另一個接收,沒有優先的一種類型(handle_cast,handle_call,或handle_info)的。

使用handle_call可能會成爲一個問題,因爲gen_server進程必須返回才能處理隊列中的下一個cast/call/info。例如,在handle_call中,避免gen_server:使用self()!調用!

5

gen_server在與客戶端進程不同的進程中運行,因此當您對其進行調用/轉換時,實際上是將消息發送到服務器進程。所有消息都放置在進程消息隊列中,進程逐個處理消息。如果消息在進程繁忙時到達,則將其放入消息隊列中。因此,同時到達的日誌消息不會互相干擾,因爲它們將按順序處理。

這不是gen_server的屬性,而是erlang中所有進程的一般屬性,這就是爲什麼gen_server文檔中沒有提到這一點。

相關問題