如何使用spawn / 4?

时间:2019-05-07 20:46:54

标签: elixir spawn

我正在尝试使用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函数。但是,出现以下错误:

  

[错误]节点:node2 @ remote上的进程#PID <16431.208.0>中的错误,退出值为:{:undef, [{Hello, :world, [], []}]}

1 个答案:

答案 0 :(得分:0)

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

:erlang.spawn/4文档所述,此函数在所有方面均与: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!"已打印出来。