我有一个进程,许多线程都链接到这个进程,以便将自己与此进程相关联。我以这种方式制作系统,这样我就可以随时轻松地查看谁与中央流程相关联,而无需跟踪应用程序本身内的任何列表。我可以简单地做process_info(self(),links)
并且erlang跟踪哪些进程仍然存在,等等......
至少,我是这么认为的,直到我发现此线程上返回的列表此时不准确:
% P is my central pid
(node@host)212> P.
<0.803.0>
% Get all the links to it
(node@host)213> {links,L} = process_info(P,links).
{links,[<0.29179.155>,<0.6492.250>,<0.29990.293>|...]}
% Counting out all the links
(node@host)214> length(L).
31154
% Filtering out all of the dead processes, put them in Lf
(node@host)215> Lf = lists:filter(fun(Pid) -> try process_info(Pid,links) of {links,_} -> true; _ -> false catch _:_ -> false end end, L).
[<0.29179.155>,<0.6492.250>,<0.29990.293>,<0.23619.530>|...]
% Lf is only about half the size, half the linked processes are dead!
(node@host)216> length(Lf).
15654
% Proof that the links haven't changed in the interim
(node@host)217> {links,L} = process_info(P,links).
{links,[<0.29179.155>,<0.6492.250>,<0.29990.293>|...]}
我唯一能想到的就是这会导致网络连接问题,因为某些链接可能来自另一台机器上某个节点上的线程。这是一个可能的解释吗?有没有办法让线程清理其链接列表?
答案 0 :(得分:0)
这是我的错。这实际上是我如何检查进程是否已经死亡的问题。 process_info不能处理远程节点上的线程。 d&#39;!哦