当你在 Erlang 中需要高性能的共享状态时你会怎么做?
What do you do when you need high performance shared state in Erlang?
Erlang 非常擅长通过不共享状态来清理事物。但是当你想要共享状态时会发生什么?例如:配置选项、统计信息收集、event/callback 服务器。使用一些记录作为状态或使用进程字典生成新进程是实现共享状态的一种方式。您将一遍又一遍地循环该过程并回复任何消息。多个进程将使用本质上不纯的 getter 和 setter 函数来查询该进程,这些函数环绕消息传递,但在这里我们只是将 Erlang 变成一个比 java 对象慢的不纯对象因为减少系统轮流比在每个全局状态周围有一个内存互斥体要慢。一不留神,甚至还有可能导致邮箱溢出。
那么如果你想要快速共享状态怎么办? Reddis,一个数据库,mnesia,产生循环状态?你如何在 erlang 中使中心化状态更纯粹地发挥作用?
使用使用 named_table
选项创建的 public(任何人都可以读或写)或受保护的(一个作者,多个读者)ets table。每个需要访问 table 中共享状态的进程都可以通过其名称访问 table。
Erlang 非常擅长通过不共享状态来清理事物。但是当你想要共享状态时会发生什么?例如:配置选项、统计信息收集、event/callback 服务器。使用一些记录作为状态或使用进程字典生成新进程是实现共享状态的一种方式。您将一遍又一遍地循环该过程并回复任何消息。多个进程将使用本质上不纯的 getter 和 setter 函数来查询该进程,这些函数环绕消息传递,但在这里我们只是将 Erlang 变成一个比 java 对象慢的不纯对象因为减少系统轮流比在每个全局状态周围有一个内存互斥体要慢。一不留神,甚至还有可能导致邮箱溢出。
那么如果你想要快速共享状态怎么办? Reddis,一个数据库,mnesia,产生循环状态?你如何在 erlang 中使中心化状态更纯粹地发挥作用?
使用使用 named_table
选项创建的 public(任何人都可以读或写)或受保护的(一个作者,多个读者)ets table。每个需要访问 table 中共享状态的进程都可以通过其名称访问 table。