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 并发状态访问的主要内容,如果未能解决你的问题,请参考以下文章
Elixir/Erlang 中的命名函数是不是有等效于 __MODULE__ 的方法?
Elixir/Erlang:变量列表与许多其他列表合并时出错
将本地 Elixir/Erlang 连接到 Docker 容器内正在运行的应用程序