【发布时间】:2011-07-26 00:25:58
【问题描述】:
我试图了解这里发生了什么:
我有一个主管在不触发MaxR, MaxT 机制的情况下循环重启一个客户端。客户端只是缓慢地崩溃,永远不会触发速率限制。
会有另一种机制使用supervisor:which_children/1 和delete_child/2, start_child/2 使子集适应现实(它对USB 设备的扫描试图找到每个设备一个监督子)。
这通常表现为速率限制的安全网,但奇怪的是,它看起来根本没有调用删除和启动子项的机制。
为了了解发生了什么,我从 shell 中调用了 supervisor:which_children/1,看起来调用只是阻塞并且永远不会返回。
是否会在主管忙于尝试重新启动孩子时阻止对主管的调用?
附录:
看起来崩溃发生在子启动期间:
=SUPERVISOR REPORT==== 29-Mar-2011::21:36:20 ===
Supervisor: {local,gateway_sup}
Context: start_error
Reason: {'EXIT',{timeout,{gen_server,call,[<0.155.0>,late_init]}}}
Offender: [{pid,<0.76.0>},
{name,gw_3_5},
{mfa,{channel,start_link,
[[{gateways,[{left,108},{right,103}]}],
{3,5}]}},
{restart_type,transient},
{shutdown,10000},
{child_type,worker}]
【问题讨论】:
-
你是在孩子的
start_link函数里做gen_server:call吗? -
是的,我愿意。我需要在 gen_server 已经运行后进行一些后期初始化。
-
为什么不在
init函数中这样做呢?看来这里可能有死锁的风险…… -
@Adam:late_init 中的东西需要 gen_server 已经运行(需要 gen_server 的 pid)。我在这里看不到任何死锁的可能性(并且超时的原因是已知的)。你可以在这里看到代码ideone.com/KtM6N
-
抛开你的问题,你应该可以在
gen_server进程中运行self()来获得它自己的pid。
标签: erlang erlang-otp erlang-supervisor