如何使用spawn/4?

How to use spawn/4?

我正在尝试使用 Node.spawn/4 在远程 Elixir 节点上部署一个函数,但我似乎无法管理它。

我已经在 iex 的 Hello 模块中定义了相关函数 (hello world),并尝试使用 Node.spawn(:node2@remote, Hello, :world, []).

部署它
iex(node1@local) defmodule Hello do
...(node1@local) def world, do: IO.puts("Hello World)
...(node1@local) end

Node.spawn(:node2@remote, Hello, :world, [])

我希望 spawn/4 将模块 Hello 发送到远程节点,以便在尝试生成它时在那里识别函数 world/0。但是,我收到以下错误:

[error] Error in process #PID<16431.208.0> on node :node2@remote with exit value: {:undef, [{Hello, :world, [], []}]}

您使用的术语让您很难理解您尝试过的内容。

:erlang.spawn/4 documentation, this function works in all the aspects exactly as :erlang.spawn/3 所述,除了它在远程节点上执行代码。没有涉及 deploy,不管它是什么意思。远程节点必须为调用者所知并且必须包含要执行的代码。

elixir-lang.org 上有一个很棒的教程 — Distributed tasks and configuration.

要检查远程节点是否对调用者可见,可以调用 Node.connect/1

总结一下。

从两个不同的终端启动两个名为 iex 的会话:

$ iex --sname foo
$ iex --sname bar

从第一个尝试开始:

Node.spawn(:bar@localhost, IO, :puts, ["¡YAY!"])

您应该会看到 "¡YAY!" 已打印出来。要测试您自己的 Hello.world/0,此函数必须为 目标节点 所知。因此,切换到 :foo@localhost 实例并键入:

defmodule Hello, do: def world, do: IO.puts("¡YAY!")

现在切换到 :bar@localhost 并执行:

Node.spawn(:foo@localhost, Hello, :world, [])

您应该会看到 "¡YAY!" 打印出来。