2008-11-03 35 views
4

我在Erlang看過很多聊天的例子,但是像列表中的工作隊列呢?如果我想構建一個工作隊列系統,就像項目管理系統一樣,是否可以在流程郵箱中重新排序郵件,還是必須使用郵件優先級? Erlang中有工作流系統的例子嗎?是否有可能在Erlang中建立工作隊列?

回答

7

您不能在Erlang的進程消息隊列中重新排序消息。

但是,您可以做選擇性接收,其中您可以首先接收您認爲最重要的消息。它不完全相同,但適用於大多數目的。

下面是一個例子:

receive 
    {important, Msg} -> 
     handle(Msg) 
after 0 -> 
    ok 
end, 
receive 
    OtherMsg -> 
     handle(Msg) 
end 

它不同於:

receive 
    {important, Msg} -> 
     handle(Msg); 
    OtherMsg -> 
     handle(Msg) 
end 

在它總是會繼續處理郵件的其餘部分之前掃描整個消息隊列爲{important, Msg}。這意味着,如果這些消息存在,這些消息將始終在任何其他消息之前處理。這當然會帶來一些性能成本(需要更多時間掃描整個隊列兩次)。

1

進程郵箱對於作業隊列非常有效。

只要你的信息包含足夠的信息,以便選擇性接收模式很容易編寫,你不會覺得需要重新排序郵箱內容。

1

如果您確實需要重新排序消息,則可以遵循關守模式:將郵箱作爲單獨的進程進行重新定義。當您的原始流程準備好接收其他消息時,網守可以根據您選擇的任何規則計算要轉發的消息。

相關問題