You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 23:25:36