Erlang消息发送和接收与多个进程

Posted

技术标签:

【中文标题】Erlang消息发送和接收与多个进程【英文标题】:Erlang message sending and receiving with multiple processes 【发布时间】:2020-10-08 23:40:42 【问题描述】:

我正在从事 Erlang 的一个学校项目。我正在尝试在这里创建一个主进程,它将产生 5 个进程,然后这些进程将调用列表中的人员。文本文件如下:

约翰,[吉尔,乔,鲍勃]。 吉尔,[鲍勃,乔,鲍勃]。 苏,[吉尔,吉尔,吉尔,鲍勃,吉尔]。 鲍勃,[约翰]。 乔,[苏]。

但由于收到此错误,我无法创建新进程。请帮我解决这个问题,我不明白错误。

invoke(Elem)  ->
  X,Y = Elem,
  Pid = spawn(calling, people, [X,Y]),
  register(X,Pid).

第二个模块

people(N,Persons) ->
  lists:foreach(fun contact/1, Persons),
  io:fwrite("in people\n").

我得到的错误是:

 =ERROR REPORT==== 18-Jun-2020::20:27:49 ===
Error in process <0.59.0> with exit value:
undef,[calling,people,[john,[jill,joe,bob]],[]]

=ERROR REPORT==== 18-Jun-2020::20:27:49 ===
Error in process <0.60.0> with exit value:
undef,[calling,people,[jill,[bob,joe,bob]],[]]

=ERROR REPORT==== 18-Jun-2020::20:27:49 ===
Error in process <0.61.0> with exit value:
undef,[calling,people,[sue,[jill,jill,jill,bob,jill]],[]]

=ERROR REPORT==== 18-Jun-2020::20:27:49 ===
Error in process <0.62.0> with exit value:
undef,[calling,people,[bob,[john]],[]]

=ERROR REPORT==== 18-Jun-2020::20:27:49 ===
Error in process <0.63.0> with exit value:
undef,[calling,people,[joe,[sue]],[]]

【问题讨论】:

【参考方案1】:

错误消息显示模块calling 中不存在具有2 个参数的函数people。有几种可能:

    模块calling 不存在 模块calling 不可访问(不在路径中) 模块calling 未编译 函数people/2未在模块calling中导出

编辑

您可以使用命令rp(code:get_path()). 检查路径代码(Erlang 机器将搜索模块的位置列表)。如果你没有做任何特别的事情,你会得到一个包含"." 作为第一个元素的列表,然后是所有的 erlang 库。点表示工作目录。

使用命令pwd().,可以得到这个工作目录的位置。

然后您应该查找一个名为 calling.beam 的文件。如果它不存在,则必须编译模块,例如在 shell 中使用命令 c(calling).

如果它存在但位于工作目录以外的其他位置,则您必须在其中一种解决方案中进行选择(我不知道哪种解决方案更适合您的情况):

    使用命令code:add_path("Path/to/your/beam/file")添加beam文件所在的目录(每次启动Erlang VM时都必须这样做) 检查您需要的所有梁文件是否在同一目录中并从该目录启动 VM。最终将工作目录更改为正确的位置:cwd("beam/file/directory").

在 Erlang 中,虽然不是强制性的,但人们习惯用相同的方式组织文件,看起来像:

申请 doc -> 适用于所有文档文件 src -> 用于所有源文件(module.erl、application.app.src) 包含 -> 用于所有头文件 (module.hrl) ebin -> 用于所有已编译的文件(module.beam、application.app) ...

这足以启动和制作一些简单的程序。对于实际应用,人们使用rebar3 等工具来管理和组织文件和构建过程。

【讨论】:

您好,呼叫存在并且 people/2 已导出。如何检查调用是否不可访问或未编译?

以上是关于Erlang消息发送和接收与多个进程的主要内容,如果未能解决你的问题,请参考以下文章

Erlang Tracing:因果一致性?

为啥第二次调用接收没有在 Erlang shell 中检索消息?

Erlang热门代码加载

Erlang 模块向 shell 程序发送和接收消息

Erlang 并发编程

Erlang 并发编程基础之一