2011-10-10 91 views
-4

需要從接收來自其他進程的許多傳入消息的進程實現同步呼叫。區分的問題 - 當呼叫回復到呼叫時。我是否需要產生額外的進程來從隊列中提取消息到緩衝區,而不會遇到返回消息,然後將其發送到主進程,並在其他人接受之後。來自進程的同步呼叫與許多傳入消息

+1

我不知道我理解你的問題。 –

+1

假設我已經正確地理解了你的問題 - 但我懷疑它 - 你有幾個進程向單個服務器發送隨機消息,這需要收集(也許處理)消息,直到它收到一條特殊消息,在這種情況下,它會回覆主叫方。你是這個意思嗎? –

+0

我的進程是客戶端和分佈式db節點之間的中介。最終clent可以要求節點之間的複製。在複製期間,不能處理任何對db的請求,它們必須在複製完成後進行緩衝和處理。複製完成觸發器發送消息給介體,但在介體隊列中有很多消息。調解員如何知道他收到有關複製的特殊消息? – Yola

回答

0

訣竅是使用引用作爲令牌用於複製:

replicate() -> 
    {ok, Token} = db:ask_replicate(...), 
    receive 
     {replication_completed, Token} -> 
      ok 
    end 

其中Token與對make_ref()一個呼叫建立。由於沒有其他信息會匹配Token,您是安全的。其他郵件將被放置在郵箱中供以後審查。

但是,上述解決方案並未將進程崩潰考慮在內。您還需要在數據庫服務器上安裝監視器。讓模式正確的最簡單方法是讓介體爲gen_server。或者,您可以閱讀LearnYouSomeErlang中的章節:http://learnyousomeerlang.com/what-is-otp#the-basic-server查看kitty_server中的同步呼叫。

+0

男人,現在我在Cesarini和湯普森的第11章,下一個是「OTP行爲」,然後我肯定讀了提供的鏈接。謝謝。))) – Yola

+0

現在我實現了額外的線程,哪個工作是過濾器消息,與它我解決了mwssage隊列的一致性和從隊列的中間彈出所需的消息。你知道,在調用ask_replicate和replication_completed到達之間,我可以從另一個進程獲得噸的消息。 – Yola