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

Erlang Shell中如何使用带参数的spawn函数创建进程

在Erlang Shell中Spawn带参数的进程

你遇到的问题核心是:Erlang标准库中没有spawn(Fun, Args)这样的重载版本——spawn/1只接受0元匿名函数,spawn/3则要求传入模块名、函数名(原子)和参数列表。在Shell里直接传带参数的函数,得用以下两种方法解决:

方法1:用变量捕获的匿名函数(最推荐)

Erlang的匿名函数会自动捕获当前作用域中的变量,所以你可以先把参数绑定到变量,再在匿名函数里直接使用它。这样就可以用spawn/1来启动进程:

% 先绑定参数TID,比如用当前Shell进程ID作为示例
TID = self(),
% 启动进程,匿名函数捕获TID变量
A = spawn(fun() ->
    receive
        {FROM, MSG} -> FROM ! {self(), MSG}
    after 0 ->
        TID ! {self(), timeouted}
    end
end).

这种方法最适合Shell环境下快速测试,不需要额外定义模块或导出函数。

方法2:用spawn/3配合apply调用匿名函数

如果你非要用带参数的函数形式,可以借助erlang:apply/2来调用带参数的匿名函数,把整个调用包在一个0元匿名函数里传给spawn/1,或者直接用spawn/3调用apply:

TID = self(),
% 方式A:用spawn/1包apply调用
A = spawn(fun() ->
    apply(fun(MyTID) ->
        receive
            {FROM, MSG} -> FROM ! {self(), MSG}
        after 0 ->
            MyTID ! {self(), timeouted}
        end
    end, [TID])
end).

% 方式B:直接调用spawn/3调用apply
A = spawn(erlang, apply, [fun(MyTID) ->
    receive
        {FROM, MSG} -> FROM ! {self(), MSG}
    after 0 ->
        MyTID ! {self(), timeouted}
    end
end, [TID]]).

为什么你之前的写法不对?

  • 你尝试的spawn(fun(TID)->..., TID):Erlang没有这个重载,spawn不接受“带参数的fun + 参数”的组合。
  • 你尝试的spawn(?MODULE, fun()->..., TID):spawn/3的第二个参数必须是函数名(原子),不能是匿名函数;第三个参数必须是参数列表(比如[TID]),而不是单个参数。而且?MODULE在Shell环境下通常是user_default,但匿名函数不属于这个模块,所以这种写法根本不生效。

内容的提问来源于stack exchange,提问作者Bercovici Adrian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:56:43