gpt4 book ai didi

erlang:生成失败(节点,乐趣):badfun 错误

转载 作者:行者123 更新时间:2023-12-04 11:22:56 25 4
gpt4 key购买 nike

远程节点位于不同的机器上。

我从本地节点测试:

$ erl -name foobar
Erlang/OTP 17 [erts-6.2] [source] [64-bit] [smp:2:2] [async-threads:10] [kernel-poll:false]

Eshell V6.2 (abort with ^G)
(foobar@debian.localdomain)1> Aliyun='aliyun@localhost2.localdomain'.
'aliyun@localhost2.localdomain'
(foobar@debian.localdomain)2> spawn(Aliyun, fun() -> io:format("hello~n") end).
<6108.86.0>
(foobar@debian.localdomain)3>
=ERROR REPORT==== 4-Jul-2015::21:03:27 ===
Error in process <0.86.0> on node 'aliyun@localhost2.localdomain' with exit value: {{badfun,#Fun<erl_eval.20.90072148>},[{erlang,apply,2,[]}]}


(foobar@debian.localdomain)3> spawn(Aliyun, io, format, ["hello~n"]).
hello
<6108.87.0>
(foobar@debian.localdomain)4> net_adm:ping(Aliyun).
pong

你可以看到 spawn(node,module,function,args)有效,但 spawn(node,fun)才不是。

远程节点上的 Erlang 版本是 R15,而本地节点上的版本是 R17。是这个原因吗?因为代码格式不同?我不清楚 Erlang 在将 fun 类型传递给远程节点时如何对其进行编码。在字节码中?

请帮忙!

最佳答案

正如您收到的错误消息所示,匿名函数在此上下文中基本上被视为在 erl_eval 中定义。模块。如果你有相同版本的erl_eval在发送节点和接收节点上,一切正常,因为在这种情况下,erl_eval 的两个副本具有相同的版本和校验和,因此接收节点能够正确评估从发送节点传递的匿名函数。但是如果两个节点有不同的erl_eval模块,评估匿名函数将失败。

一个有趣的尝试是在 R15 节点上定义匿名函数,通过 term_to_binary/1 将其转换为二进制。 ,将生成的二进制文件发送或复制到 17.x 节点,通过 binary_to_term/1 将其转换回术语,然后将生成的术语作为匿名函数传递给您的 spawn称呼。首先,在 R15 节点上:

(r15@myhost)1> F = fun() -> io:format("hello~n") end.
(r15@myhost)2> Bin = term_to_binary(F).
<<131,112,0,0,2,179,0,158,45,156,12,16,101,74,154,214,21,
222,196,219,108,205,131,0,0,0,20,0,0,...>>
(r15@myhost)3> file:write_file("/tmp/fun", Bin).
ok

现在将二进制文件读入 17.x 节点,并将 spawn用它调用 R15 节点:
(r17@myhost)1> {ok, Bin} = file:read_file("/tmp/fun").
{ok,<<131,112,0,0,2,179,0,158,45,156,12,16,101,74,154,
214,21,222,196,219,108,205,131,0,0,0,20,...>>}
(r17@myhost)2> F = binary_to_term(Bin).
#Fun<erl_eval.20.82930912>
(r17@myhost)3> spawn(r15@myhost, F).
hello
<7101.90.0>

如您所见——您也应该亲自尝试一下—— spawn调用按预期工作,因为匿名函数是在 R15 节点上创建的,并且它也在此处进行评估。 17.x 节点只是通过它。

关于erlang:生成失败(节点,乐趣):badfun 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31221058/

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