Für das folgende Fragment:Laich/1 und die gemeinsame Nutzung der äußeren Variablen
outer_func(State) ->
spawn(fun()-> do_something(State) end).
Wird State
geteilt werden oder tief kopiert den erzeugten Prozess Haufen?
Für das folgende Fragment:Laich/1 und die gemeinsame Nutzung der äußeren Variablen
outer_func(State) ->
spawn(fun()-> do_something(State) end).
Wird State
geteilt werden oder tief kopiert den erzeugten Prozess Haufen?
Es wird tief kopiert werden. Hier ist eine einfache Demo:
1> State = lists:seq(1, 1000000).
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,
23,24,25,26,27,28,29|...]
2> DoSomething = fun(State) -> io:format("~p~n", [process_info(self(), memory)]) end.
3> spawn(fun() -> DoSomething(State) end), spawn(fun() -> DoSomething(State) end), spawn(fun() -> DoSomething(State) end).
{memory,16583520}
{memory,16583520}
{memory,16583520}
Im Gegensatz dazu, hier ist der Ausgang, wenn der Staat eine große binäre ist, die nie „tief“ kopiert wird, wenn mit mehreren Prozessen gemeinsam:
1> State = binary:copy(<<"a">>, 50000000).
<<"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"...>>
2> DoSomething = fun(State) -> io:format("~p~n", [process_info(self(), memory)]) end.
3> spawn(fun() -> DoSomething(State) end), spawn(fun() -> DoSomething(State) end), spawn(fun() -> DoSomething(State) end).
{memory,8744}
{memory,8744}
{memory,8744}
So ein Prozess mit einer Liste von ganzen Zahlen von 1 bis 1 Million verwendete ungefähr 16MB Speicher, während der mit einer großen binären 8KB verwendete (die binäre sollte eigentlich ein vernachlässigbarer Teil davon sein).
Prozesse teilen nicht! – rvirding