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消息发送和接收与多个进程的主要内容,如果未能解决你的问题,请参考以下文章