Erlang 是否与两个进程共享ETS表?

Erlang 是否与两个进程共享ETS表?,erlang,ets,Erlang,Ets,我在一个进程中创建ETS表,并希望在另一个进程中使用它。如何在第二个过程中“打开”ETS表?在手册页中找不到良好的功能。您必须使用“命名表”和“公共”选项创建ets表 像 在这种情况下,其他本地进程可以使用名为“yourtablename”的表。无需在其他进程中显式打开此表。如果不希望表具有唯一名称,可以省略命名表,只需使用公共。然后,ets:new将返回一个整数,您需要将该整数传递给需要访问该表的进程: -module(foo). -compile(export_all). create_t

我在一个进程中创建ETS表,并希望在另一个进程中使用它。如何在第二个过程中“打开”ETS表?在手册页中找不到良好的功能。

您必须使用“命名表”和“公共”选项创建ets表


在这种情况下,其他本地进程可以使用名为“yourtablename”的表。无需在其他进程中显式打开此表。

如果不希望表具有唯一名称,可以省略
命名表
,只需使用
公共
。然后,
ets:new
将返回一个整数,您需要将该整数传递给需要访问该表的进程:

-module(foo).
-compile(export_all).

create_the_table(Pid) ->
    Table = ets:new(mytable, [public]),
    ets:insert(Table, {foo, bar}),
    Pid ! {the_table_is, Table},
    timer:sleep(infinity).

use_the_table() ->
    receive {the_table_is, Table} -> ok end,
    io:format("~p~n", [ets:lookup(Table, foo)]).
从shell中尝试:

2> c(foo).
{ok,foo}
3> Pid1 = spawn(foo, use_the_table, []).
<0.43.0>
4> spawn(foo, create_the_table, [Pid1]).
[{foo,bar}]
<0.45.0>
2>c(foo)。
{好的,富}
3> Pid1=spawn(foo,使用表[])。
4> 生成(foo,创建表[Pid1])。
[{foo,bar}]

正如奥多贝努斯和莱戈西亚所说,您可以通过名称(命名为_table)或标识符(将标识符传递给其他进程)访问ets表,并将表公开

它是否从另一个模块访问没有区别

确保在执行ets:info时,表已经创建(由其他进程创建)。

new(名称、选项)->tid()| atom()
in

创建新表并返回可在后续操作中使用的表标识符。表标识符可以发送到其他进程,以便在节点内的不同进程之间共享表

任何进程都可以读取或写入表

受保护的所有者进程可以读取和写入表。其他进程只能读取该表。这是访问权限的默认设置

只有所有者进程才能读取或写入表


因为我没有ETS方面的经验,所以没有将此作为答案发布,但只要所有进程都在同一个VM上,您就应该能够在任何ETS函数调用中简单地引用正确的表名(atom)。请参阅:我的电脑可以从不同的模块访问它吗?我正在做ets:info(mytab,size),在一个模块中大小为1,但在另一个模块中大小未定义。表名是精确的,我的声明如您所说,我使用atom名称:Tab=ets:new(mytab,[named_Table,public,set])。所以,当我在最后一条注释中执行info()时,我使用mytab调用表大小
2> c(foo).
{ok,foo}
3> Pid1 = spawn(foo, use_the_table, []).
<0.43.0>
4> spawn(foo, create_the_table, [Pid1]).
[{foo,bar}]
<0.45.0>