最近我一直在試圖理解Erlang中的併發服務器。考慮下面的代碼向服務器發出請求。取決於特定的執行順序,可以通過3個進程打印不同的值。什麼是訂單?每個流程的最高價值和最低價值是多少?Erlang併發理解
test() ->
Server = start(),
spawn(fun() ->
incr(Server),
io:format("Child 1 read ~p~n", [read(Server)]) end),
incr(Server),
spawn(fun() ->
incr(Server),
io:format("Child 2 read ~p~n", [read(Server)]) end),
io:format("Parent read ~p~n", [read(Server)]).
的代碼執行鍼對下面的服務器:
-module(p4).
-export([start/0, init/0, read/1, incr/1, reset/1]).
start() ->
spawn(fun() -> init() end).
init() -> loop(0).
loop(N) ->
receive
{read, Pid} ->
Pid ! {value, self(), N},
loop(N);
{incr, Pid} ->
Pid ! {incr_reply, self()},
loop(N+1);
{reset, Pid} ->
Pid ! {reset_reply, self()},
loop(0)
end.
read(Serv) ->
Serv ! {read, self()},
receive {value, Serv, N} -> N end.
incr(Serv) ->
Serv ! {incr, self()},
receive {incr_reply, Serv} -> ok end.
reset(Serv) ->
Serv ! {reset, self()},
receive {reset_reply, Serv} -> ok end.
- 父:最低= 1最高= 3
- Child1:最低= 1最高= 3
- CHILD2:最低= 1最高= 2
我不完全確定o rders,但我想這可能是因爲:
- Child1可以讀1,2和3
- 家長可以讀1,2和3
- CHILD2可以讀取1和2
這對於最低價值,最高價值和訂單都是正確的嗎?
[Erlang服務器請求次序]的可能重複(http://stackoverflow.com/questions/32992743/erlang-server-request-order) –
這是類似的概念,但我只想知道如果我做了正確的時間。試圖瞭解輸出的順序。 –