Process Elixir/Erlang能否复制进程,包括其内存?

Process Elixir/Erlang能否复制进程,包括其内存?,process,erlang,elixir,Process,Erlang,Elixir,我正在考虑使用长生不老药解决一个问题,主要是因为它能够以低廉的成本产生大量的进程 在我的场景中,我想创建几个“原始”进程,将特定的、不可变的数据加载到内存中,然后根据需要复制这些进程。所有副本都将使用相同的基础数据,但使用它执行不同的只读任务;例如,假设一本“原著”的记忆中有“战争与和平”的文本,而该原著的每一份副本都对文本进行了不同的分析 我的问题是: 是否可以在Elixir/Erlang VM中复制现有进程、内存内容和所有内容 如果是这样的话,每个拷贝消耗的内存是否与原始拷贝一样多,或者它

我正在考虑使用长生不老药解决一个问题,主要是因为它能够以低廉的成本产生大量的进程

在我的场景中,我想创建几个“原始”进程,将特定的、不可变的数据加载到内存中,然后根据需要复制这些进程。所有副本都将使用相同的基础数据,但使用它执行不同的只读任务;例如,假设一本“原著”的记忆中有“战争与和平”的文本,而该原著的每一份副本都对文本进行了不同的分析

我的问题是:

  • 是否可以在Elixir/Erlang VM中复制现有进程、内存内容和所有内容
  • 如果是这样的话,每个拷贝消耗的内存是否与原始拷贝一样多,或者它们是否可以像Unix进程使用“写时拷贝”策略那样共享内存?(在这种情况下,将不会有后续写入。)

Erlang进程除了存储在变量(和)中的数据外,没有特定于进程的数据,因此要复制进程的内存,只需生成一个新进程,将所有相关变量作为参数传递给函数即可


通常,进程之间不共享内存;一切都是复制的。例外情况是ETS表(尽管进程读取数据时会从ETS表复制数据)和大于64字节的二进制文件。如果您将“战争与和平”存储在二进制文件中,并将其发送给每个工作进程(或者在生成这些工作进程时将其传递),那么这些进程将共享内存,仅当它们想要修改二进制文件时才复制内存。有关更多详细信息,请参阅《Erlang效率指南》中的。

没有内置的复制流程的方法。最简单的方法是启动“原始”流程和“副本”,并将消息中的所有相关数据发送给副本。进程不共享数据,因此没有更有效的方法。将数据放在ETS表中只能部分帮助共享,因为ETS表中的数据在使用时会复制到进程中,但是,您不需要将所有数据都放在进程堆中。

您认为Erlang/Elixir进程与Unix进程类似。它们根本不是,我真希望它们有一个不同的名称,因为它们实际上不是标准Unix意义上的线程或进程。我花了一些时间才意识到这些差异

你必须抛弃你对流程的所有先入为主的想法,它们都是错误的。电子进程具有以下特点

  • 它们又便宜又快。使用大量的,总是有更多

  • 他们不共享资源[1]。(即使是向stdout写入数据,也是向另一个Eprocess发送的消息。)

  • 与标准Unix IPC相比,IPC(或消息)速度非常快,开销相对较低

在您的案例中,我将尝试创建一个管理数据的服务器,并让每个分析工作者消息都成为服务器所需的数据块。让电子流程或多或少成为一个标准是完全可以接受的 共享内存管理器

对我来说,认为电子进程最有用的方式是将其视为具有自己执行线程的对象


[1] 当然,有ETS表,但最好将其视为在绝对必要之前不共享资源。

进程不共享,或者只共享非常有限的特定类型的数据。大型二进制文件是共享的。我想我可能问错了问题。回顾过去,我真的想问“我可以加载或构建一些只读数据,生成多个进程,并让它们都使用它吗?”答案是肯定的。例如,在使用宏进行编译期间,数据可以存储在Elixir模块属性或函数体中,派生的进程可以在运行时调用该函数或访问该属性。我想要共享的实际数据更像是一个字典,其中键是数字数组,值是字典数组。是否可以通过二进制文件共享和使用?(很抱歉有这么多的新手问题,但我正在尝试在深入研究之前确定可行性。)我会从以下几点开始。虽然从ETS表中读取数据时会复制数据,但如果同时只查看其中的一部分,工作进程应该能够跟上垃圾收集的速度。我也会选择ETS,或者根据需要将相关数据发送到其他进程。但是,如果您进行基准测试,并且这确实是一个性能问题,那么您可以将键值编码为一个大的二进制文件,并让每个进程从中提取信息。IIRC,Kresten在他的HanoiDB应用程序中使用了这种技术:使用ETS表的问题在于每个进程都没有自己的数据副本。此外,使用ETS意味着您将在每次访问数据时不断向进程复制数据。当然,这取决于您希望这些副本的工作方式。@NathanLong您可以从一个术语为_to _binary/1的二进制文件中提取数据。是的,您可以共享并发送二进制文件,但这仍然意味着您要构建您提取的数据,因此从长远来看,您在发送数据时不会赢得任何好处。事实上,在多次提取和重建相同的数据时,您可能会丢失数据。它们是进程,而不是Unix进程。除Unix之外,还有其他系统。:-)事实上,在学习使用电子束一年之后,我可能会以完全不同的方式回答这个问题。它们更像是全局可访问的,因为当您访问它们时,数据会在表和流程之间复制。在概念上,它们类似于进程状态,但实现方式不同。