【问题标题】:Sending big lists between processes in Erlang / Elixir在 Erlang / Elixir 中的进程之间发送大列表
【发布时间】:2017-06-11 17:50:02
【问题描述】:

假设您想将一个大列表(例如 1_000_000 个条目)发送到 Erlang / Elixir 中的不同进程。

  • send 会阻塞直到整个列表的数据发送完毕,还是 Erlang VM 以某种方式异步完成?
  • 只是发送列表是一种不好的做法吗?有哪些替代方案?

【问题讨论】:

标签: erlang elixir message-passing


【解决方案1】:
  • 是和不是。复制巨大的结构不会阻止接收者,而是阻止发送者。有关类似问题,请参阅 my answer
  • 是的,如果你经常这样做是不好的做法。或者:
    1. 重构您的代码,以便您可以将数据分区到不同的进程。
    2. 将数据存储在ets。 (这不是灵丹妙药,您仍然可以将数据复制进出ets,但这取决于您的访问模式。)
    3. 以二进制形式存储数据。

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

【讨论】:

  • 我只是出于好奇而问,因为我目前正面临在 Java 中的两个线程之间传递大量数据的问题。 Java 中的并发是一个真正的痛苦,所以我对如何在使用消息传递的 Elixir 中做同样的事情很感兴趣。如果我必须在 Elixir 中解决同样的问题,我可能会使用 ets 表或提供类似列表的访问模式的单独进程,就像你说的那样。
  • @LucaFülbier:请记住,即使您将代理进程与类似列表的 API 一起使用,您仍然可能由于堆大小而面临长时间的 GC 暂停。 Erlang 的 GC 的生成特性会有所帮助,但有时您会看到此进程响应中的长时间停顿,类似于 Java 行为。
猜你喜欢
  • 2015-11-27
  • 2014-02-20
  • 2018-07-03
  • 2017-08-07
  • 2016-08-12
  • 2014-06-07
  • 2018-08-13
  • 2021-10-15
  • 1970-01-01
相关资源
最近更新 更多