Concurrency 发送到已注册进程时出现Erlang错误

Concurrency 发送到已注册进程时出现Erlang错误,concurrency,process,erlang,message,primes,Concurrency,Process,Erlang,Message,Primes,我正试图制作一个Erlang程序,用进程查找素数(我知道这是无效的,但嘿,这只是为了好玩:)-类似于 在每一个“勾号”上,服务器都会产生一个新的进程(“编号”),该进程会增加其计数器。若counter==那个数字,那个么它是一个因子,所以我们会让服务器知道。若服务器并没有收到任何消息,那个么它就是一个素数 对于较小的数字(素数高达N,服务器(50,L)行),这是可以的,但对于较大的数字,它会崩溃: 使用退出值处理时出错:{badarg,[{primes,number,2,[{file,“prim

我正试图制作一个Erlang程序,用进程查找素数(我知道这是无效的,但嘿,这只是为了好玩:)-类似于

在每一个“勾号”上,服务器都会产生一个新的进程(“编号”),该进程会增加其计数器。若counter==那个数字,那个么它是一个因子,所以我们会让服务器知道。若服务器并没有收到任何消息,那个么它就是一个素数

对于较小的数字(素数高达N,
服务器(50,L)
行),这是可以的,但对于较大的数字,它会崩溃:

使用退出值处理时出错:{badarg,[{primes,number,2,[{file,“primes.erl”},{line,31}]}

第31行是
服务器!点击
1-但我不明白它为什么会失败。可能失败的那一行是在编号(N,1)之后的那一行。但为什么会失败?

守则:

-module(primes).
-compile(export_all).

main() ->
  pg:create(numbers),
  Server_PID = spawn(?MODULE,server,[]),
  register(server,Server_PID),
  ok.

server()     -> server(2,[]).
server(50,L) -> io:format("Primes: ~p~n",[L]);
server(N,L)  ->
  Num_PID = spawn(?MODULE,number,[N]),
  pg:join(numbers,Num_PID),
  pg:send(numbers,tick),
  receive
    hit ->
      flush(),
      server(N+1,L)
  after 100 ->
      server(N+1,[N|L])
  end.

number(N)   -> receive {pg_message,_,_,tick} -> number(N,1) end.
number(N,I) ->
  receive
    {pg_message,_,_,tick} ->
      if
        N =:= I ->
          server ! hit,
          number(N,1);
        true ->
          number(N,I+1)
      end
  end.

flush() ->
  receive _ -> flush()
  after   0 -> ok end.

当一个已注册进程死亡时,它所注册的名称将不再注册。向引用死进程的pid发送消息是完全合法的(消息只是消失了),但向未注册的名称发送消息是错误的,即使该名称曾经注册过


在您的代码中,
服务器
进程执行50个循环,生成一个新进程,并等待
命中
消息或超时。之后,
server/2
功能结束,
server
进程终止。当它死亡时,名称
服务器
将不再注册,因此尝试向其发送消息将生成一个
badarg
错误。

当注册的进程死亡时,它所注册的名称将不再注册。向引用死进程的pid发送消息是完全合法的(消息只是消失了),但向未注册的名称发送消息是错误的,即使该名称曾经注册过


在您的代码中,
服务器
进程执行50个循环,生成一个新进程,并等待
命中
消息或超时。之后,
server/2
功能结束,
server
进程终止。当它死亡时,
服务器的名称
将不再注册,因此尝试向其发送消息会产生一个
badarg
错误。

谢谢,似乎就是这样。其他进程实际上是向未注册的名称发送消息。谢谢,似乎就是这样。其他进程实际上是向未注册的名称发送消息。