我创建了一个主管来启动孩子,每个孩子都在创建自己的 ETS 表。基本上,一切看起来都很好,除了当我尝试启动 50 多个孩子时,它说数据库表太多,这也是一个糟糕的设计。我想以这样一种方式实施,即主管创建孩子并且所有孩子都使用一个 ETS 表。即使孩子想要写入 ETS 表,它也会写入全局 ETS 表。
我试图谷歌但找不到任何帮助。
谢谢!
我创建了一个主管来启动孩子,每个孩子都在创建自己的 ETS 表。基本上,一切看起来都很好,除了当我尝试启动 50 多个孩子时,它说数据库表太多,这也是一个糟糕的设计。我想以这样一种方式实施,即主管创建孩子并且所有孩子都使用一个 ETS 表。即使孩子想要写入 ETS 表,它也会写入全局 ETS 表。
我试图谷歌但找不到任何帮助。
谢谢!
为什么说创建 50 个 ETS 表是一个糟糕的设计?这一切都取决于您的要求。如果这 50 个进程需要同时访问 ETS,那么将它们限制为仅一张表可能会影响性能,因为一次只能有一个进程写入该表。
仅当所有这些进程都需要访问相同的数据时,创建单个表或gen_server
拥有该表并充当将数据写入表的网关(如 Nathaniel 建议)才有意义。
但是在后一种情况下,如果表 id 从主管传递给它的子进程,这样子进程可以并行读取/写入,而不是依靠中央gen_server
代理对表的请求(除非当然表现不是你的要求)。
这取决于您实际想要什么,但您可以让主管创建表并将 pid/名称传递给孩子使用。如果要在进程之间共享表,则需要让表使用公共权限。
或者制作一个服务器,负责读取和写入您要存储的数据,并让主管与其他孩子一起管理该服务器。