Elixir 分布式长生不老药示例不';行不通
我有一个非常简单的Elixir代码示例,我想在不同的节点上运行 第一个节点在我的笔记本电脑上,第二个是Raspberry Pi,通过SSH访问 代码很简单:Elixir 分布式长生不老药示例不';行不通,elixir,Elixir,我有一个非常简单的Elixir代码示例,我想在不同的节点上运行 第一个节点在我的笔记本电脑上,第二个是Raspberry Pi,通过SSH访问 代码很简单: # node1@my-computer defmodule Hello do def world, do: IO.puts "hello world" end # node2@raspberrypi iex> Node.spawn_link :"node1@my-computer", fn -> Hello.world
# node1@my-computer
defmodule Hello do
def world, do: IO.puts "hello world"
end
# node2@raspberrypi
iex> Node.spawn_link :"node1@my-computer", fn -> Hello.world end
我原以为Node.spawn\u link
会在Raspberry Pi上打印“hello world”
,但它显示了一个错误,说**(退出#PID)no connect
在具有两个不同iex
实例的同一台机器上,此代码工作正常
我在node1
上用IEx--sname node1--cookie secret
启动IEx会话,在node2
上用IEx--sname node2--cookie secret
启动IEx会话
还值得注意的是,在我的Raspberry Piiex上,以下警告开始:
警告:虚拟机以拉丁1的本机名称编码运行,这可能会导致Elixir出现故障,因为它需要utf8。请确保您的语言环境设置为UTF-8(可以通过在shell中运行“语言环境”进行验证)
Interactive Elixir(1.0.5)-按Ctrl+C退出(键入h()回车以获取帮助)
我认为您需要在节点名称中添加@
符号,以便将它们解释为单独的网络机器
iex --name node@machinename1 --cookie mycookie
iex --name node@machinename2 --cookie mycookie
然后在第一个iex外壳中连接节点:
Node.connect :"node@machinename2"
请注意,冒号语法使节点名成为elixir atom。需要引号是因为@
符号。
若遇到问题,在尝试dns名称之前,您可以先尝试使用原始ip地址的machinenames
注意:如果您正在呼叫node@raspberry
从您的计算机(反之亦然),您需要确保已在某个位置声明主机raspberry指向raspberry IP,否则运行时不知道如何查找“raspberry”。也许现在更简单的方法是使用IPs:Node.spawn\u链接:node@192.168.0.2“,…
。还可以使用节点中的其他函数来查找有关连接的内容和未连接的内容的更多信息。我将/etc/hosts
更改为将raspberrypi
指向raspberry的本地IP(192.168.1.103
)。Elixir抱怨说,[error]**系统运行时使用完全限定的主机名****主机名raspberrypi是非法的**
Ok,所以我去把名称改为IP:Node.spawn\u链接:node1@192.168.1.103“,fn->Hello.world end
,它告诉我,**无法在以下位置启动:erlang::apply,[#函数,[]([:link]):"node1@192.168.1.103***
我肯定我错过了一些非常简单的东西。好的,我明白了。一直都是IP问题,我只是把事情搞砸了。谢谢,José!Node.connect:node@machinename2“
返回一个漂亮的false
。也尝试过IP。我在某个地方读到Erlang使用的一个文件,它与Cookie有联系。你的评论之间发生了什么变化?我真的不记得了,但我很确定IP与此有关。使用原始IP地址(例如,192.168.4.160
)而不是完全限定的主机名。在中,Jose使用了两个运行Elixir 1.6.4的MacBook,分别使用iex--name bob--cookie“secret”
和iex--name alice--cookie“secret”
。他的iex提示显示为bob@bob.local
和alice@alice.local
。尝试时,iex提示符显示为bob@.Home
。能够连接到节点。连接:alice@.Home“
但是在另一个节点上调用代码不起作用。