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