【问题标题】:Erlang message sending and receiving with multiple processesErlang消息发送和接收与多个进程
【发布时间】: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]],[]}]}

【问题讨论】:

    标签: erlang


    【解决方案1】:

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

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

    编辑

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

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

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

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

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

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

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

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

    【讨论】:

    • 您好,呼叫存在并且 people/2 已导出。如何检查调用是否不可访问或未编译?
    猜你喜欢
    • 2016-03-19
    • 2023-03-31
    • 2014-06-07
    • 2014-05-28
    • 1970-01-01
    • 2021-05-28
    • 2012-09-12
    • 1970-01-01
    • 2018-04-12
    相关资源
    最近更新 更多