2
의 공유 :산란/(1)과 외부 변수 다음 조각에 대한
outer_func(State) ->
spawn(fun()-> do_something(State) end).
State
공유하거나 생성 된 프로세스 힙에 깊이가 복사 된 것인가?
의 공유 :산란/(1)과 외부 변수 다음 조각에 대한
outer_func(State) ->
spawn(fun()-> do_something(State) end).
State
공유하거나 생성 된 프로세스 힙에 깊이가 복사 된 것인가?
딥 복사됩니다. 다음은 간단한 데모는 다음과 같습니다
것과 대조적으로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}
, 여기에 상태가 여러 프로세스와 공유 할 때 "깊은"복사 결코 큰 이진 출력입니다 :
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}
그래서 과정 1에서 1 백만까지의 정수 목록은 약 16MB의 메모리를 사용하는 반면 큰 바이너리를 가진 것은 8KB를 사용했습니다 (이진 파일은 실제로 무시해도 좋습니다).
프로세스가 공유하지 않습니다! – rvirding