gpt4 book ai didi

erlang - 如果 Node 必须具有与客户端节点相同的可加载模块,那么 Erlang 上的 Spawn(Node, Fun) 有何意义?

转载 作者:行者123 更新时间:2023-12-02 06:58:08 24 4
gpt4 key购买 nike

为什么要制造出您正在向远程节点发送 Fun 以在新进程中执行的错觉?无论如何,如果客户端节点必须具有可加载的相同模块,并且 Fun 定义为服务器节点。为什么不仅是spawn(Node, M, F, A),这清楚地表明您正在发送函数调用的定义,而不是Fun本身。

最佳答案

让我们考虑两种可能的情况

引用模块函数的函数

Fun = fun file:getcwd/0,
erlang:spawn(Node, Fun).

在这种情况下,Fun确实应该可以在远程端加载。

匿名函数

Fun = fun() -> io:format("My node is ~p~n", [node()]) end,
erlang:spawn(Node, Fun).

它们也可以调用

总结

虽然函数隐含了一些限制,可以远程扩展,但这种形式仍然合适并且可以删除,因为那样第二种情况就变得不可能了

还有

一些误解可能源于此 article

实际上,如果您为匿名函数运行 erlang:fun_info,您会发现它以 AST 的形式提供实现

(b@lol4t0-home)21> rp(erlang:fun_info(fun() -> io:format("My node is ~p~n", [node()]) end)). 
[{pid,<0.96.0>},
{module,erl_eval},
{new_index,20},
{new_uniq,<<99,62,121,82,122,95,246,237,63,72,118,40,4,
25,16,50>>},
{index,20},
{uniq,52032458},
{name,'-expr/5-fun-3-'},
{arity,0},
{env,[{[],
{eval,#Fun<shell.21.31625193>},
{value,#Fun<shell.5.31625193>},
[{clause,1,[],[],
[{call,1,
{remote,1,{atom,1,io},{atom,1,format}},
[{string,1,"My node is ~p~n"},
{cons,1,{call,1,{atom,1,node},[]},{nil,1}}]}]}]}]},
{type,local}]

关于erlang - 如果 Node 必须具有与客户端节点相同的可加载模块,那么 Erlang 上的 Spawn(Node, Fun) 有何意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39255471/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com