与两个进程共享ETS表?

时间:2012-10-28 20:06:54

标签: erlang ets

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

4 个答案:

答案 0 :(得分:10)

您必须使用'named_table'和'public'选项创建ets表。

T = ets:new(yourtablename,[public,named_table]).

在这种情况下,其他本地进程可以使用名称为“yourtablename”的此表。没有必要在其他进程中明确打开此表。

答案 1 :(得分:4)

如果您不希望表格具有唯一名称,则可以省略named_table并使用public。然后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 :(得分:0)

正如Odobenus和legoscia所说,您可以按名称访问ets表(使其成为named_table)或通过标识符(将标识符传递给其他进程),并将表公开。

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

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

答案 3 :(得分:0)

here

中的

new(Name, Options) -> tid() | atom()

  

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

     

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

     

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

     

private只有所有者进程可以读取或写入表。