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

时间:2012-09-19 09:08:15

标签: erlang

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

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

以下打印出“bar”:

(foo@host) rpc:call('bar@host', erlang, display, [test]).

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

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

1 个答案:

答案 0 :(得分:12)

行为差异的原因是 由谁完成输出:

  • erlang:display/1是一个 BIF ,由BEAM直接处理,直接将其写入标准输出,而无需靠近Erlang的io系统。因此,在bar上执行此操作会导致其打印到bar的标准输出。

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

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