2008-11-03 49 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

如果您确实需要重新排序消息,则可以遵循关守模式:将邮箱作为单独的进程进行重新定义。当您的原始流程准备好接收其他消息时,网守可以根据您选择的任何规则计算要转发的消息。

相关问题