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
相关产品推荐
相关产品推荐

