在Erlang/Elixir中的进程之间发送大列表
假设您想向Erlang/Elixir中的另一个进程发送一个大列表(例如1000个条目)在Erlang/Elixir中的进程之间发送大列表,erlang,elixir,message-passing,Erlang,Elixir,Message Passing,假设您想向Erlang/Elixir中的另一个进程发送一个大列表(例如1000个条目) send是否会一直阻塞直到整个列表的数据被发送,或者这是由Erlang VM异步完成的 仅仅发送列表是一种糟糕的做法吗?有哪些替代方案 是和否。复制巨大的结构不会阻止接收者,而是阻止发送者。注意一个类似的问题 是的,如果你经常这样做,这是一种坏习惯。或者: 重构代码,以便将数据划分到不同的进程 将数据存储在ets中。(这不是一个灵丹妙药,您仍然可以在ets中复制数据,但这取决于您的访问模式。) 以二进制形
是否会一直阻塞直到整个列表的数据被发送,或者这是由Erlang VM异步完成的send
- 仅仅发送列表是一种糟糕的做法吗?有哪些替代方案
- 是和否。复制巨大的结构不会阻止接收者,而是阻止发送者。注意一个类似的问题
- 是的,如果你经常这样做,这是一种坏习惯。或者:
- 重构代码,以便将数据划分到不同的进程
- 将数据存储在ets中。(这不是一个灵丹妙药,您仍然可以在
中复制数据,但这取决于您的访问模式。)ets
- 以二进制形式存储数据
这取决于你做什么。您不应该在一个流程中有一个大的堆,所以您可能应该重构代码。不要认为这是一个好主意。检查此问题->您可以使用它将数据存储在中并传递对周围表的引用。我只是出于好奇而问,因为我目前正面临在Java中的两个线程之间传输大量数据的问题。Java中的并发是一个真正的难题,所以我对如何在Elixir中使用消息传递做同样的事情感兴趣。如果我必须在Elixir中解决同样的问题,我可能会使用一个ets表或一个单独的进程来提供类似列表的访问模式,如您所说。@LucaFülbier:请记住,即使您将代理进程与类似列表的API一起使用,您仍然可能会因为堆大而面临长时间的GC暂停。Erlang的GC的生成特性会有所帮助,但有时您会看到在这个过程响应中出现类似于Java行为的长时间停顿。