2010-05-31 96 views
6

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

据我所知,循环将从“接收”一条消息开始,然后执行一些操作并打到循环的另一个迭代。

因此,必须同步?对?

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

要并行处理多个消息,您将不得不在不同的进程中产生多个消息循环,对吧?

还是我误解了这一切?

回答

9

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

4

从手册(Erlang concurrency

每个进程具有用于其接收的消息自身的输入队列。接收在队列的末尾把新的消息。当一个进程执行接收,在所述第一消息队列与接收中的第一个模式相匹配,如果匹配,则消息从队列中移除,并执行与该模式相对应的动作
但是,如果第一个模式不匹配,则第二个模式是测试,如果匹配,消息将从队列中移除,并执行与第二个模式相对应的操作。如果第二个模式不匹配第三是尝试等等,直到没有更多的模式来测试。如果没有更多的模式可以测试,则第一条消息保存在队列中,而我们尝试第二条消息。如果这匹配任何模式,则会执行相应的操作,并将第二条消息从队列中删除(将第一条消息和其他消息保留在队列中)。如果第二条消息不匹配,我们尝试第三条消息,依此类推直到我们到达队列末尾。如果我们到达队列末尾,则进程阻塞(停止执行)并等待,直到收到新消息并重复此过程。
当然,Erlang的实现是“聪明的”,并且最大限度地减少了每个消息针对每个接收模式的测试次数。

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