【问题标题】:Phoenix/Erlang node connectionPhoenix/Erlang 节点连接
【发布时间】:2019-07-19 18:44:18
【问题描述】:

我在一台机器上启动了 Elixir Phoenix 节点,在另一台机器上启动了 Erlang 节点。 Erlang 节点有一个名为“rec”的进程,它接受三个元素的元组:一个原子和两个字符列表。当我在 Elixir 节点上运行此代码时:

Node.spawn_link(node_name, fn -> send(:rec, {:create, uuid, link}) end)

它根据需要运行,但是当我从 Phoenix 控制器运行它时,它返回如下错误:

[error] Error in process #PID<14185.2561.0> on node :"node1@192.168.0.137" with exit value:
{:undef, [{#Function<0.87309885/0 in SlrRecorderApiWeb.CameraController.add/2>, [], []}]}

我应该怎么做才能正确运行它?

【问题讨论】:

    标签: concurrency erlang elixir phoenix-framework distributed-computing


    【解决方案1】:

    发生这种情况是因为模块 SlrRecorderApiWeb.CameraController 未加载到相关 Erlang 节点上:当您发送 fn 函数以在另一个节点上运行时,定义它的模块必须在两个节点上加载.

    好消息是你不需要在这里使用函数,你可以使用:

    send({:rec, node_name}, {:create, uuid, link})
    

    消息将被发送到另一个节点上名为rec的进程。

    【讨论】:

    • 当您发送fn 函数以在另一个节点上运行时,定义它的模块必须在两个节点上加载。 -- 如何才能匿名函数在模块中定义?
    • @7stud 匿名函数被认为是在其代码出现的模块中“定义”的。事实上,VM 甚至记录了匿名函数是在哪个命名函数中定义的。在错误消息中我们看到#Function&lt;0.87309885/0 in SlrRecorderApiWeb.CameraController.add/2,它指的是在模块SlrRecorderApiWeb.CameraController 中的函数add/2 中定义的arity 0 的匿名函数。
    猜你喜欢
    • 2011-04-11
    • 2014-06-28
    • 2017-12-16
    • 2013-04-16
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多