(也可以在Erlang 的邮件列表中找到。)
是否可以编写一个函数,等待 Erlang 节点上运行的每个进程到达阻塞点,等待消息?
仅当每个进程都在等待尚未发送给它的消息时,该函数才应返回。假设没有进程处于与时间相关的暂停状态(使用 after 子句接收、与计时器相关的操作等)。当然,运行此功能的进程被排除在外。
显然是错误的答案:
erlang:yield/0
:这给了所有其他进程运行的机会,但在它被阻塞之前不一定。
(也可以在Erlang 的邮件列表中找到。)
是否可以编写一个函数,等待 Erlang 节点上运行的每个进程到达阻塞点,等待消息?
仅当每个进程都在等待尚未发送给它的消息时,该函数才应返回。假设没有进程处于与时间相关的暂停状态(使用 after 子句接收、与计时器相关的操作等)。当然,运行此功能的进程被排除在外。
显然是错误的答案:
erlang:yield/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)
.