【问题标题】:Erlang message loopsErlang 消息循环
【发布时间】:2011-02-25 23:11:43
【问题描述】:

erlang 中的消息循环如何工作,它们在处理消息时是否同步?

据我了解,循环将从“接收”消息开始,然后执行某些操作并触发循环的另一个迭代。

所以必须同步?对吧?

如果多个客户端将消息发送到同一个消息循环,那么所有这些消息都会排队并一个接一个地执行,或者?

要并行处理多条消息,您必须在不同的进程中产生多个消息循环,对吗?

还是我全都误解了?

【问题讨论】:

    标签: erlang parallel-processing message-loop


    【解决方案1】:

    发送消息是异步的。处理消息是同步的 - 一次接收一条消息 - 因为每个进程都有自己的(并且只有一个)邮箱。

    【讨论】:

      【解决方案2】:

      来自手册(Erlang concurrency

      每个进程都有自己的接收消息输入队列。收到的新消息放在队列的末尾。当进程执行接收时,队列中的第一条消息与接收中的第一个模式匹配,如果匹配,则从队列中删除消息并执行与模式对应的操作。
      但是,如果第一个模式不匹配,则测试第二个模式,如果匹配,则从队列中删除消息并执行与第二个模式对应的操作。如果第二个模式不匹配,则尝试第三个模式,依此类推,直到没有更多模式要测试。如果没有更多要测试的模式,则将第一条消息保留在队列中,然后我们尝试第二条消息。如果这与任何模式匹配,则执行适当的操作并从队列中删除第二条消息(保留第一条消息和队列中的任何其他消息)。如果第二条消息不匹配,我们将尝试第三条消息,依此类推,直到到达队列的末尾。如果我们到达队列的末尾,进程会阻塞(停止执行)并等待,直到收到新消息并重复此过程。
      当然,Erlang 实现是“聪明的”并且最小化每条消息的次数针对每次接收中的模式进行测试。

      因此您可以使用正则表达式创建 prios,但并发是通过多个进程完成的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-11
        • 2021-10-13
        相关资源
        最近更新 更多