我有一個gen_server模塊,在客戶端進程發送數據時將數據記錄到文件中。當兩個客戶端進程同時向這個模塊發送數據時會發生什麼?文件操作是否會相互衝突?這裏erlang documentation令人沮喪不清。當兩個客戶端同時調用gen_server方法時會發生什麼?
4
A
回答
13
每個Erlang進程都維護一個消息隊列。該過程將獲取消息並逐個處理消息。
在您的例子,如果兩個客戶端在同一時間調用gen_server
,這些電話將成爲gen_server
過程的隊列中的消息,gen_server
會處理這些消息一個接一個。所以不必擔心衝突。
但是,如果一個進程必須處理來自其他進程的太多消息,則需要考慮進程的容量並優化設計,否則它將成爲瓶頸。
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文檔中沒有提到這一點。
相關問題
- 1. 當你同時觸摸兩個按鈕時會發生什麼
- 2. 當兩個線程同時調用相同的靜態方法時會發生什麼?
- 3. Java:openGL:JOGL:當我調用display()方法時,幕後會發生什麼?
- 4. 當我們調用ArrayList.add()方法時會發生什麼?
- 5. 當WCF客戶端爲同一個合同指定多個端點時會發生什麼?
- 6. 從C#客戶端調用COM方法時發生InvalidCastException
- 7. 當我調用兩次相同的方法時發生了什麼
- 8. 當客戶端在Impala中觸發查詢時會發生什麼?
- 9. 當兩個具有相同端口的進程配置時會發生什麼
- 10. 當你調用UItableview的重裝兩次時會發生什麼
- 11. WCF服務 - 當客戶端沒有得到響應時會發生什麼?
- 12. 當java中有多個主要方法時會發生什麼?
- 13. 當調用StartInstances操作時發生客戶端錯誤(UnauthorizedOperation)
- 14. 線程通過另一個類調用同步方法時會發生什麼?
- 15. SignalR - 當用戶未經授權時不會調用客戶端方法
- 16. 當某個線程調用Thread.interrupt()時,會發生什麼?
- 17. 當調用ajax調用時會發生什麼?
- 18. 在DisplayObjectContainer上調用addChild或removeChild方法時會發生什麼?
- 19. 當Qt應用程序的quit()方法被調用時,QDialogs會發生什麼?
- 20. 當您使用數組調用方法removeAllObjects時會發生什麼?
- 21. 當我使用PHP :: SOAP調用Web服務方法時會發生什麼?
- 22. 調用setCancelsTouchesInView時會發生什麼?
- 23. 在Mockito中連續進行兩次方法調用時會發生什麼?
- 24. 當兩個對象相等時會發生什麼
- 25. 當兩個類創建對象時會發生什麼?
- 26. SignalR HTTP 500當從客戶端調用服務器方法時
- 27. 如果兩個用戶同時鎖定互斥鎖,會發生什麼情況?
- 28. 當我在抽象方法上調用_user_func()時會發生什麼?
- 29. java-當我在構造函數中調用方法時會發生什麼?
- 30. 當我們顯式調用垃圾收集器方法時會發生什麼?
謝謝!我設法找到問題。事實證明,它根本不是一個併發問題(正如你所指出的那樣),而是它是一個序列化問題。我沒有正確地使用Erlang位串語法來序列化我的數據,所以字節丟失了。 – quanticle