5

我在 Erlang 中看到了很多聊天示例,但是列表呢,比如工作队列?如果我想构建一个工作队列系统,比如项目管理系统,是否可以在流程邮箱中重新排序消息,还是必须使用消息优先级?有没有用 Erlang 构建的工作流系统的例子?

4

3 回答 3

8

您不能在 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}在继续处理其余消息之前扫描整个消息队列。这意味着这些类型的消息将始终在任何其他消息之前处理,如果它们存在的话。这当然会带来一些性能成本(扫描整个队列两次需要更多时间)。

于 2008-11-03T11:09:24.490 回答
2

进程邮箱对于作业队列来说工作得很好。

只需让您的邮件包含足够的信息,以便易于编写选择性接收模式,并且您不会觉得需要重新排序邮箱内容。

于 2008-11-13T02:04:00.097 回答
2

如果您确实需要重新排序邮件,您可以遵循看门人模式:将邮箱具体化为一个单独的进程。当您的原始进程准备好接收另一条消息时,网守可以根据您选择的任何规则计算要转发的消息。

于 2008-11-13T02:40:29.727 回答