我不熟悉Elixir和分布式编程。我尝试通过Youtube中的Jose Valim示例从其他节点生成方法的示例。但这不起作用,找不到正确的答案。
iex(bob@local)2> Node.spawn(:"alice@alice.local", fn -> Hello.world() end)
#PID<0.116.0>
22:05:12.657 [warn] ** Can not start :erlang::apply,[#Function<20.128620087/0 in :erl_eval.expr/5>, []] on :"alice@alice.local" **
我尝试了此Distributed Elixir example doesn't work中的所有建议。Panuto说,这全都与IP有关。我也尝试Node.connect的东西。但是我仍然无法解决它。我错过了什么?
答案 0 :(得分:2)
有两种情况:
要连接在同一台计算机上运行的两个Elixir节点,请打开两个终端窗口并尝试以下操作:
在终端窗口1中:
$ iex --sname alice
Erlang/OTP 21 [erts-10.2] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [hipe] [dtrace]
Interactive Elixir (1.7.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(alice@eugene-mbp)1>
在终端窗口2中:
$ iex --sname bob
Erlang/OTP 21 [erts-10.2] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [hipe] [dtrace]
Interactive Elixir (1.7.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(bob@eugene-mbp)1>
这里eugene-mbp
是我的计算机的主机名,没有域部分。有了域部分,它看起来像是eugene-mbp.local
。
如果您想在两台单独的计算机上运行节点,但只有一台计算机,则可以尝试使用Docker。打开两个终端窗口,然后尝试以下操作:
在终端窗口1中:
$ docker run -it --rm --name node1 --hostname node1 --network example elixir:1.7-alpine iex --sname alice --cookie secret
Erlang/OTP 21 [erts-10.2] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [hipe] [dtrace]
Interactive Elixir (1.7.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(alice@node1)1>
在终端窗口2中:
$ docker run -it --rm --name node2 --hostname node2 --network example elixir:1.7-alpine iex --sname bob --cookie secret
Erlang/OTP 21 [erts-10.2] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [hipe] [dtrace]
Interactive Elixir (1.7.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(bob@node2)1>
现在让我们回到在另一个节点上生成一个进程的过程。以下步骤将基于上面的在同一台计算机上运行示例。
在终端窗口#1中运行以下命令:
iex(alice@eugene-mbp)1> Node.list()
[]
iex(alice@eugene-mbp)2> Node.ping(:"bob@eugene-mbp")
:pong
iex(alice@eugene-mbp)3> Node.list()
[:"bob@eugene-mbp"]
在上面的命令序列中,我们首先查看节点是否彼此了解,而事实上它们却不知道。然后,我们对“ bob”节点执行ping操作。然后,我们再次检查节点是否彼此了解,现在它们知道了!
现在,让我们在“ bob”节点上定义一个模块。打开2号终端,并输入以下内容:
iex(bob@eugene-mbp)1> defmodule Hello do
...(bob@eugene-mbp)1> def world do
...(bob@eugene-mbp)1> IO.puts "Hello, world!"
...(bob@eugene-mbp)1> end
...(bob@eugene-mbp)1> end
{:module, Hello,
<<70, 79, 82, 49, 0, 0, 4, 40, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 0, 140,
0, 0, 0, 15, 12, 69, 108, 105, 120, 105, 114, 46, 72, 101, 108, 108, 111, 8,
95, 95, 105, 110, 102, 111, 95, 95, 7, ...>>, {:world, 0}}
最后,让我们调用我们刚刚在“ alice”节点中定义的函数。打开#1终端并运行它。这是完整的输出:
iex(alice@eugene-mbp)4> Node.spawn(:"bob@eugene-mbp", fn -> Hello.world() end)
Hello, world!
#PID<10894.142.0>
iex(alice@eugene-mbp)5>