浏览 5189 次
精华帖 (4) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-05-26
如果把simple_one_for_one的supervisor的restart strategy设定为transient 那么 引用 Restart defines when a terminated child process should be restarted.
A permanent child process is always restarted. A temporary child process is never restarted. A transient child process is restarted only if it terminates abnormally, i.e. with another exit reason than normal. 也就是除了normal的exit,其他的情况都会从新启动. 但是事实上如果exit(Pid,shutdown)的话,就无法restart. 结果查了一下supervisor的source code,发现了一个极为白痴的错误 do_restart(_, shutdown, Child, State) -> NState = state_del_child(Child, State), {ok, NState}; do_restart(transient, Reason, Child, State) -> report_error(child_terminated, Reason, Child, State#state.name), restart(Child, State); 到底是document写错了呢?还是代码有问题。 但是按照常理推断,supervisor这种kernel库,应该是经过严格测试的,而且现在Erlang都已经version 12了,这种bug也应该有人发现吧. 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-05-27
normal一般约定为程序执行完成后正常退出,shutdown则约定为用户发起的退出,都算作正常退出。区分是有必要的,库里面有几个地方都有对这两个的特殊处理。
|
|
返回顶楼 | |
发表时间:2008-05-27
to qiezi: 没看出来上面的程序有严重的bug吗? 这种bug对于erlang这样的系统算非常丢信心的哦。
|
|
返回顶楼 | |
发表时间:2008-06-02
汗...确实有点白痴......
|
|
返回顶楼 | |
发表时间:2008-06-03
到底有bug没??
|
|
返回顶楼 | |
发表时间:2009-05-23
难道这已成为悬案?现在已经是R13了啊……
|
|
返回顶楼 | |