让Erlang节点上的“每个进程运行直到被阻塞”

时间:2013-02-25 10:30:45

标签: erlang

(也可在Erlang's mailing list上找到。)

是否有可能编写一个函数来等待Erlang节点上运行的每个进程到达被阻塞的位置,等待消息?

只有当每个进程都在等待尚未发送给它的消息时,该函数才会返回。假设没有进程处于与时间相关的暂停中(使用after子句接收,与计时器相关的操作等)。当然,排除了运行此功能的过程。

显然是错误的答案:

erlang:yield/0:这为每个其他进程提供了运行的机会,但不一定会被阻止。

1 个答案:

答案 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)的返回值有多少信任。