erlang - 发送大消息性能

时间:2011-03-22 16:30:43

标签: erlang

假设我在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设计。但我认为通过扎实的工作和轻松的并发管理是合理的。

2 个答案:

答案 0 :(得分:6)

来自Erlang Efficiency Guide

  

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).

(抱歉最终的语法错误)。