假设我在erlang应用程序中创建了新的本地进程,并且我想向它发送一条重要信息。
-module(chain_hello).
start(N, Some_big_data)->
Pid1 = spawn(chain_hello, some_fun, [N]),
Pid1 ! Some_big_data,
io:format("done \n").
尽管Some_big_data
是对真正大数据(例如文件内容)的引用 - 它是否在发送时被复制?对表现有很大的惩罚吗?
通常我会使用一些线程安全的共享对象(和/或互斥锁)。 Erlang中是否有任何解决方案可以避免复制邮件内容?
ADDED:
有趣的情况是Some_big_data是结构化内容 - 具体:map,我可以在其上执行某些操作。
ADDED2
好吧,我看到Erlang没有这样的解决方案(在工作进程中剪切一些结构化数据,如地图) - 因为Erlang设计。但我认为通过扎实的工作和轻松的并发管理是合理的。
答案 0 :(得分:6)
Erlang之间的消息中的所有数据 进程被复制,用 相同的refc binaries例外 Erlang节点。
是的,您应该避免在流程之间发送大的条款。如果您需要发送大量数据,请将其作为二进制文件发送。
答案 1 :(得分:4)
作为建议,您只能将当前进程的pid(self())发送到您要处理some_big_data的进程。这样,当您想要使用some_big_data时,您可以从第二个进程将其引用回来。
例如:
-module(proc1).
send_big_data() ->
BigData = get_some_big_data(),
Pid = spawn(fun proc2:start/0),
Pid ! {process_big_data, self()},
loop(Pid, BigData).
loop(Pid,BigData) ->
receive
get_first_element ->
[H|T] = BigData,
Pid ! {response, H};
_ ->
Pid ! {nothing}
end,
loop(Pid).
(抱歉最终的语法错误)。