Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Erlang/Elixir中的进程之间发送大列表_Erlang_Elixir_Message Passing - Fatal编程技术网

在Erlang/Elixir中的进程之间发送大列表

在Erlang/Elixir中的进程之间发送大列表,erlang,elixir,message-passing,Erlang,Elixir,Message Passing,假设您想向Erlang/Elixir中的另一个进程发送一个大列表(例如1000个条目) send是否会一直阻塞直到整个列表的数据被发送,或者这是由Erlang VM异步完成的 仅仅发送列表是一种糟糕的做法吗?有哪些替代方案 是和否。复制巨大的结构不会阻止接收者,而是阻止发送者。注意一个类似的问题 是的,如果你经常这样做,这是一种坏习惯。或者: 重构代码,以便将数据划分到不同的进程 将数据存储在ets中。(这不是一个灵丹妙药,您仍然可以在ets中复制数据,但这取决于您的访问模式。) 以二进制形

假设您想向Erlang/Elixir中的另一个进程发送一个大列表(例如1000个条目)

  • send
    是否会一直阻塞直到整个列表的数据被发送,或者这是由Erlang VM异步完成的
  • 仅仅发送列表是一种糟糕的做法吗?有哪些替代方案
      • 是和否。复制巨大的结构不会阻止接收者,而是阻止发送者。注意一个类似的问题
      • 是的,如果你经常这样做,这是一种坏习惯。或者:
      • 重构代码,以便将数据划分到不同的进程
      • 将数据存储在ets中。(这不是一个灵丹妙药,您仍然可以在
        ets
        中复制数据,但这取决于您的访问模式。)
      • 以二进制形式存储数据

      这取决于你做什么。您不应该在一个流程中有一个大的堆,所以您可能应该重构代码。

      不要认为这是一个好主意。检查此问题->您可以使用它将数据存储在中并传递对周围表的引用。我只是出于好奇而问,因为我目前正面临在Java中的两个线程之间传输大量数据的问题。Java中的并发是一个真正的难题,所以我对如何在Elixir中使用消息传递做同样的事情感兴趣。如果我必须在Elixir中解决同样的问题,我可能会使用一个ets表或一个单独的进程来提供类似列表的访问模式,如您所说。@LucaFülbier:请记住,即使您将代理进程与类似列表的API一起使用,您仍然可能会因为堆大而面临长时间的GC暂停。Erlang的GC的生成特性会有所帮助,但有时您会看到在这个过程响应中出现类似于Java行为的长时间停顿。