我在一个进程中创建 ETS 表,我想在另一个进程中使用它。我如何在第二个过程中“打开”ETS 表?在手册页中找不到好的功能。
问问题
3122 次
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 回答