Erlang 中的优先接收可以很容易地实现如下:
prio() ->
receive
{priority, X} -> X
after 0 ->
receive
X -> X
end
end.
我正在读一篇名为,作者 Nyström,他们在其中描述了以下问题:
[上面]的[代码]示例的主要问题是,我们没有考虑到当从内部阻塞接收恢复评估时,我们的邮箱中可能有不止一条消息。在最坏的情况下,除了可能数量巨大的第一个元素之外的所有元素都可能是优先级消息。在这种情况下,我们实际上会完成与我们想要做的事情恰恰相反的事情。
我不完全明白这一点。
问题(1):我假设一旦内部阻塞接收将被“调用”(即恢复)one消息已经到达消息队列了吧?假设在从内部阻塞接收恢复所需的短时间内,队列中已经有一大堆消息在等待,这是否现实?
问题(2):另外,最坏的情况被描述为队列中有一条普通消息和大量优先级消息。由于所有接收子句首先针对队列中的第一条消息进行检查,然后针对队列中的第二条消息进行检查,...(来源:thisbook http://erlang.org/download/erlang-book-part1.pdf,第 69-70 页)这不应该是:许多普通消息在队列末尾带有优先级消息吗?
Erlang 是一种完全并发的语言,没有理由不能同时发送多条消息。沿着“哦,这很快——其他线程不可能在那么短的时间内做一些冲突的事情”这样的假设本质上与闭上眼睛说“不存在竞争条件这样的事情,有竞争条件”是一样的。没有竞赛条件这样的东西......”
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)