远程节点,组负责人和打印输出

Rob*_*loi 5 erlang

给定两个Erlang节点"foo @ host"和"bar @ host",以下内容在"foo"上产生打印输出:

(foo@host) rpc:call('bar@host', io, format, ["~p", [test]]).
Run Code Online (Sandbox Code Playgroud)

以下打印出"bar":

(foo@host) rpc:call('bar@host', erlang, display, [test]).
Run Code Online (Sandbox Code Playgroud)

即使erlang:display/1应该仅用于调试,两个函数都应该将内容发送到标准输出.每个进程都应该从其父进程继承组长,所以我希望这两个函数以一致的方式运行.

上述行为是否有任何理由?

rvi*_*ing 12

行为差异的原因在于输出完成的位置方式:

  • erlang:display/1是一个BIF,由BEAM直接处理,直接将其写入标准输出,而无需靠近Erlang的io系统.所以这样做会bar导致它打印到bar标准输出.

  • io:format/1/2由Erlang io系统处理.由于没有IoDevice给出,它向其组长发送了一个io请求.rpc:call/4实现的目的是远程生成的进程继承执行RPC调用的进程的组长.因此输出转到调用进程的标准输出.因此foo,对节点执行RPC调用会bar导致输出变为foo标准输出.

因此差异.值得注意的是,在Erlang io系统中不需要对此进行特殊处理,一旦设置了组长,它就会透明地工作.