我在一个进程中创建ETS表,我想在另一个进程中使用它。我如何在第二个过程中“打开”ETS表?在手册页中找不到好的功能。
答案 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)
new(Name, Options) -> tid() | atom()
创建一个新表并返回一个表标识符,该标识符可用于后续操作。表标识符可以发送到其他进程,以便可以在节点内的不同进程之间共享表。
public任何进程都可以读取或写入表。
protected所有者进程可以读取和写入表。其他进程只能读取表。这是访问权限的默认设置。
private只有所有者进程可以读取或写入表。