【问题标题】:Remote nodes, group leaders and printouts远程节点、组长和打印输出
【发布时间】:2012-09-19 19:51:14
【问题描述】:

给定两个 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 应该仅用于调试,这两个函数都应该将内容发送到标准输出。每个进程都应该从其父进程继承组长,所以我希望这两个函数的行为方式一致。

上述行为有什么理由吗?

【问题讨论】:

    标签: erlang


    【解决方案1】:

    造成这种行为差异的原因是在哪里由谁完成输出:

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

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

    因此不同。有趣的是,在 Erlang io 系统中不需要对此进行特殊处理,一旦设置了组长,它就可以透明地工作。

    【讨论】:

    • 精彩的解释。谢谢。
    • 是的,这也是为什么 erlang:display/1 非常适合演示 Erlang I/O 的工作原理。您在具有显示或格式的远程节点上使用 rpc 的确切示例是我在培训课程中使用的。 :-)
    • @RichardC 您的意思是直接写入标准输出和使用 Erlang io 之间的区别?
    • 是的。执行 display/1 的 rpc 在远程节点的终端上打印其输出,而使用 io 的 rpc 在调用方的终端上打印。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 2021-01-12
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    相关资源
    最近更新 更多