我试图做出认定与处理素数的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.