Elixir/Erlang 并发状态访问

Posted

技术标签:

【中文标题】Elixir/Erlang 并发状态访问【英文标题】:Elixir/Erlang concurrent state access 【发布时间】:2020-12-19 20:21:04 【问题描述】:

如何从 erlang 或 elixir 中的一堆进程中组织对数据(例如 ETS 表)的并行访问? 在传统模型中,我会创建RWLock 并使临界区尽可能小。所以,我至少可以通过并行读取访问哈希表。 在 erlang 中,第一个想法是实现 gen_server 以将表存储在状态中。但是所有的访问都会被序列化。如何处理以加快服务速度?

【问题讨论】:

【参考方案1】:

使用对:ets 的直接访问并在对:ets.new/2 的调用中指定read_concurrency: true

GenServer 是这里的冗余链接,可能会成为瓶颈。

【讨论】:

但是在哪里存储 ets 表本身以及如何在没有 GenServer 之类的东西的情况下共享对它的访问?也可能需要序列化写访问。 :ets 表存储在内存中。要共享访问权限,请使用named_table。我链接的文档详细描述了它。如果您需要分布式解决方案,请使用:mnesia。如果您需要序列化写入,请使用GenServer

以上是关于Elixir/Erlang 并发状态访问的主要内容,如果未能解决你的问题,请参考以下文章

E1.获取Elixir/Erlang版本信息

Elixir/Erlang 中的命名函数是不是有等效于 __MODULE__ 的方法?

Elixir/Erlang:变量列表与许多其他列表合并时出错

将本地 Elixir/Erlang 连接到 Docker 容器内正在运行的应用程序

在 Elixir/Erlang 中的(本地)Mnesia 实例上实现最佳写入性能

Elixir/Erlang Random/Rand Seed 是不是需要在每个进程上调用?