只取当前需要的消息

同一个进程可能先后收到多类消息,而当前状态只允许处理其中一些。选择性接收把接收条件写成模式,让程序取得相应消息,同时把其他消息保留给后续处理。

Erlang的receive从队列起点寻找第一条符合某个分支模式与守卫的消息,对每条消息按分支自上而下尝试。成功的消息被取走,其余消息保持不变;没有匹配时,进程可以暂停等待。

参考:[1]

处理次序不同于到达次序

一条较早入队却不匹配的消息,可以被较晚但匹配的消息越过。程序因而能够等待某次请求的特定回复,却也必须决定旧消息何时处理,不能假定留下的内容会自动消失。

消息队列的排列本身也有接口条件。Erlang通常按接收次序入队,但启用优先级消息接收后存在不同规则。信号送达、队列排列与receive实际挑选,是三层相互关联却不完全相同的次序。

参考:[1] [2]

超时不一定省去扫描

Erlang文档指出,寻找特定消息可能检查它前面的许多队列元素,成本随这些元素数量增长。即使receive设置after 0,在确认没有匹配项以前仍可能需要扫描整条队列,不能把零等待解释为恒定计算成本。

以新建引用匹配回复的特定形式,可以让编译器与运行时缩小需要检查的范围。这样的优化依赖具体条件;从协议上减少无用消息、正确识别请求并管理积压,仍然比只不断缩短超时更直接。

参考:[1]