我有一个非常简单的Elixir代码示例,我想在不同的节点上运行。分布式Elixir示例不起作用
第一个节点在我的笔记本电脑上,第二个节点是Raspberry Pi,通过SSH访问。
代码很简单:
# [email protected]
defmodule Hello do
def world, do: IO.puts "hello world"
end
# [email protected]
iex> Node.spawn_link :"[email protected]", fn -> Hello.world end
我预计Node.spawn_link
将在树莓派打印"hello world"
,而是它显示了两种不同的iex
情况下,这种错误说** (EXIT from #PID<0.66.0>) no connect
在同一台机器代码工作得很好。
我开始在node1
与iex --sname node1 --cookie secret
和node2
与iex --sname node2 --cookie secret
的IEx会话。
另外值得一提的是,在我的树莓派iex
此警告开始:
warning: the VM is running with native name encoding of latin1 which may cause Elixir to malfunction as it expects utf8. Please ensure your locale is set to UTF-8 (which can be verified by running "locale" in your shell) Interactive Elixir (1.0.5) - press Ctrl+C to exit (type h() ENTER for help)
如果您从您的计算机调用'节点@ raspberry'(或副相反),你需要确保你已经声明主机树莓指向树莓IP,否则运行时不知道如何找到“树莓”。现在可能更简单的方法是使用IP:'Node.spawn_link:“[email protected]”,...'。还可以使用Node中的其他功能来查找有关已连接和未连接的更多信息。 –
我改变了'/ etc/hosts'指向'raspberrypi'到树莓的本地IP地址('192.168.1.103')。 Elixir抱怨说,[错误] **系统运行使用完全合格的主机名** **主机名raspberrypi是非法的**' 好吧,所以我去了,并更名为IP的:'Node.spawn_link:“[email protected] .1.103“,fn-> Hello.world end',它告诉我'**不能启动:erlang :: apply,[#Function <20.54118792/0 in:erl_eval.expr/5>,[]]([ :link])on:“[email protected]”**' 我相信我在这里错过了一些非常简单的事情。 – thepanuto
好的,我明白了。这一直是知识产权问题,我只是搞砸了。谢谢,何塞! – thepanuto