如何在Erlang/OTP中实现单向链接进程(子亡触发父祖终止)?
Erlang/OTP 单向阻塞关联进程实现方案
需求回顾
- 进程关联链:
grandparent <- parent <- child,仅单向触发终止:子进程死亡时,父、祖先进程依次终止;父/祖先进程死亡不影响子进程 - 进程规则:每个进程仅执行一次任务,处于
init状态时掷硬币:- 反面:直接终止
- 正面:生成子进程,进入
wait状态被子进程阻塞,直到子进程终止后自身再终止
- 示例流程:
(init) (wait) <- (init) (wait) <- (wait) <- (init) (wait) <- (wait) <- (die) (wait) <- (die) (die)
实现代码
-module(chain_processes). -export([start/0]). start() -> spawn(fun init/0). init() -> % 初始化随机数种子,确保每次启动结果不同 rand:seed(exsplus, os:timestamp()), case rand:uniform(2) of 1 -> io:format("Process ~p dies (flip tail)~n", [self()]); 2 -> ChildPid = spawn(fun init/0), % 建立单向监控:仅当前进程接收子进程的死亡消息 monitor(process, ChildPid), io:format("Process ~p waits for child ~p~n", [self(), ChildPid]), wait_for_child() end. wait_for_child() -> receive {'DOWN', _MonitorRef, process, _ChildPid, _Reason} -> io:format("Process ~p dies (child terminated)~n", [self()]) end.
关键逻辑说明
- 单向关联实现:使用
monitor(process, ChildPid)替代双向的link/1,确保父进程仅监听子进程的死亡事件,子进程不受父进程状态影响 - 阻塞逻辑:
wait_for_child/0通过receive语句阻塞进程,直到收到子进程的DOWN消息才会执行终止操作,实现“被自身生成的进程阻塞”的需求 - 链式终止:子进程终止时,父进程收到
DOWN消息后终止;父进程终止时,其监控者(祖先进程)同样收到DOWN消息并终止,完美匹配单向链式终止规则 - 随机逻辑:用
rand:uniform(2)模拟掷硬币,配合随机数种子初始化,保证每次运行的进程链生成结果不同
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

