我正在尝试使用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, [], []}]}
答案 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!"
已打印出来。