spervisor阻塞

a.erl
-behaviour(supervisor)
start_link() ->
	supervisor:start_link({local, ?MODULE}, ?MODULE, []).
init(Args) ->
	{ok, {one_for_one, 10,10},[{b, {b, start_link, Args}, permanent, 5000, worker, [b]}]}.
b.erl
-behaviour(gen_server)
start_link(Args) ->
	gen_server:start_link(?MODULE, Args, []).
init(Args) ->
	supervisor:start_child(a, {c, {c, start_link, []}, permanent, 5000, worker, [c]}),
	{ok, #{}}.
c.erl
-behaivour(gen_server)
start_link(Args) ->
	gen_server:start_link(?MODULE, Args, []).
init(Args) ->
	{ok,#{}}. 

启动supervisor a时,a会启动b,然后b在init里面调用supervisor:start_child,因为start_link在init返回后并且所有子进程创建结束后才会返回,当a调用start_link时,a阻塞,此时b调用start_link后也阻塞了(因为init因为a在阻塞,所以没返回),就形成了死锁。
解决方法就是修改b的代码

b.erl
-behaviour(gen_server)
start_link(Args) ->
	gen_server:start_link(?MODULE, Args, []).
init(Args) ->
	%% supervisor:start_child(a, {c, {c, start_link, []}, permanent, 5000, worker, [c]}).
	a ! start_child,
	{ok, #{}}.
handle_info(start_child, State) ->
	supervisor:start_child(a, {c, {c, start_link, []}, permanent, 5000, worker, [c]}),
	{noreply, #{}}.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值