对于以下片段:
outer_func(State) -> spawn(fun()-> do_something(State) end).
State将被共享还是深度复制到派生的进程堆?
State
0sgqnhkj1#
它将被深度复制。下面是一个简单的演示:
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到100万的整数列表的进程使用大约16MB的内存,而包含大二进制数的进程使用8KB(二进制数实际上应该是其中可以忽略的一部分)。
1条答案
按热度按时间0sgqnhkj1#
它将被深度复制。下面是一个简单的演示:
与此相反,当状态是一个大的二进制文件时,当与多个进程共享时,它永远不会被“深度”复制,下面是输出:
因此,一个包含从1到100万的整数列表的进程使用大约16MB的内存,而包含大二进制数的进程使用8KB(二进制数实际上应该是其中可以忽略的一部分)。