Erlang error on send to registered process

2019-10-17 06:54发布

我试图做出认定与处理素数的Erlang程序(无效的,我知道,但是,嘿,这只是为了好玩:)) -沿东西线numbersimulation.com 。

在每个“嘀”的服务器会生成新的进程(“数字”),其增加它的计数器。 如果计数器==这个数字,这是一个因素,所以我们让服务器知道。 如果服务器没有得到任何消息,这是一个素数。

在小数字(素数高达N,该server(50,L)线)也没关系,但对那些大它崩溃了:

Error in process <0.46.0> with exit value: {badarg,[{primes,number,2,[{file,"primes.erl"},{line,31}]}]}

该生产线31是server ! hit server ! hit一个-但我不明白为什么它失败。 也许这失败线是一前一后, number(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.

Answer 1:

当注册进程死亡它是根据不再被登记注册的名称。 将消息发送到它是指一个死进程PID是完全合法的(消息刚刚消失)发送给未注册的名称是错误的,即使名字被注册一次。

在你的代码的server进程执行50个回路产生一个新的进程,并等待一个hit消息或超时。 在这以后, server/2功能结束并且server进程死亡。 当它死名称server不再注册,以便试图把它生成发送消息badarg错误。



文章来源: Erlang error on send to registered process