(也可在Erlang's mailing list上找到。)
是否有可能编写一个函数来等待Erlang节点上运行的每个进程到达被阻塞的位置,等待消息?
只有当每个进程都在等待尚未发送给它的消息时,该函数才会返回。假设没有进程处于与时间相关的暂停中(使用after子句接收,与计时器相关的操作等)。当然,排除了运行此功能的过程。
显然是错误的答案:
erlang:yield/0
:这为每个其他进程提供了运行的机会,但不一定会被阻止。
答案 0 :(得分:0)
不是100%正确的方法:
only_one_not_waiting() ->
Running =
[P || P <- processes(), process_info(P, status) =/= {status, waiting}],
length(Running) == 1
end.
everyone_blocked() ->
case only_one_not_waiting() of
true -> ok;
false -> everyone_blocked()
end.
忽略计时器,重复运行only_one_not_waiting/0
直到它返回true(如everyone_blocked/0
那样)应指示所需的系统状态,如果最终达到此状态。
但是我不确定应该对process_info(P, status)
的返回值有多少信任。