erlang中并行快速排序的问题

pra*_*jal 7 erlang

我在erlang中编写quicksort时遇到问题.我正在做的是我产生两个进程,然后阻止当前进程,直到我从左右子阵列得到响应.获取这两个响应后,我向其父级发送一条消息,为其提供计算列表.Parent ! {self(), Lone ++ [H] ++ Ltwo}

但是我在两个子流程中都遇到了取消undef的错误.这是代码.

  quick(Parent, []) -> Parent ! {self(), []};
  quick(Parent, [H | T]) ->
      Pone = spawn_link(main, quick, [ self(), [ X || X <- T, H >= X ] ]) ,
      Ptwo = spawn_link(main, quick, [ self(), [ Y || Y <- T, H < Y ] ]) ,
      receive
          {Pone, Lone} ->
              receive
                  {Ptwo, Ltwo} -> Parent ! {self(), Lone ++ [H] ++ Ltwo}
              end;
          {Ptwo, Ltwo} ->
              receive
                  {Pone, Lone} -> Parent ! {self(), Lone ++ [H] ++ Ltwo}
              end
      end.

  sortquick(List) ->
      quick(self(), List).
Run Code Online (Sandbox Code Playgroud)

称为:

main:sortquick([12,4,7,22,25]).
Run Code Online (Sandbox Code Playgroud)

Oli*_*ves 12

代码本身不是问题.快速排序工作正常.原因可能是你在子进程中获得undef的原因是因为函数quick/2根本没有被导出.当您使用模块和函数调用spawn_link时,需要导出该函数.

您可以通过添加来修复此问题

-export([quick/2]).
Run Code Online (Sandbox Code Playgroud)

或者通过将spawn_links更改为类似的东西

spawn_link(fun() -> quick(Self, [Y || Y <- T, H < Y]) end
Run Code Online (Sandbox Code Playgroud)

虽然如果你采用后一种方式,你需要创建一个变量

Self = self()
Run Code Online (Sandbox Code Playgroud)

在你打电话之前,否则它不会回到正确的过程.

  • 因为如果它未导出,则只能从模块本机的函数中调用它.将其视为私人功能.然后当你调用erlang:spawn_link/3时,它是一个不同的模块,有效地尝试调用main:quick/2.但它不能因为main:quick/2是一个私有函数,没有其他模块知道它. (4认同)