2016-09-15 65 views
2

对于下列片段的共享:产卵/ 1和外变量

outer_func(State) -> 
    spawn(fun()-> do_something(State) end). 

State是共享的或深复制到衍生的进程堆?

+0

流程不共享! – rvirding

回答

4

它将被深度复制。这里有一个简单的演示:

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(二进制文件实际上应该是其中可以忽略的一部分)。