【问题标题】:spawn/1 and sharing of the outer variablesspawn/1 和外部变量的共享
【发布时间】:2017-01-23 14:41:18
【问题描述】:

对于以下片段:

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

State 是否会被共享或深度复制到生成的进程堆中?

【问题讨论】:

  • 进程不共享!

标签: erlang heap-memory spawn


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 2016-12-29
    • 1970-01-01
    相关资源
    最近更新 更多