5

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

4

4 回答 4

12

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

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

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

于 2012-10-28T21:02:55.670 回答
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)]).

从外壳尝试:

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>
于 2012-10-29T18:06:56.830 回答
0

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

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

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

于 2014-01-26T10:21:00.747 回答
0

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

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

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

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

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

于 2014-02-24T05:23:58.990 回答