i在一个过程中创建ETS表,我想在另一个过程中使用它。我如何在第二个过程中"打开" ETS表?在人页面上找不到好的功能。
您必须使用'nuper_table'和'public'选项创建ETS表。
喜欢
T = ets:new(yourtablename,[public,named_table]).
在这种情况下,其他本地流程可以按名称" yourTableName"使用此表。不必在其他过程中明确打开此表。
如果您不希望表具有唯一名称,则可以省略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>
正如odobenus和sugoscia所说,您可以按名称访问ETS表(使其命名为_table)或通过标识符(将标识符传递给其他过程),并将表公开。p>是否从另一个模块访问它没有区别。
确保在执行ETS:INFO时,该表是由其他过程创建的。
new(Name, Options) -> tid() | atom()
在此处
创建一个新表并返回一个表标识符,该表标识符可在后续操作中使用。表标识符可以发送到其他过程,以便可以在节点内的不同过程之间共享表。
公共任何过程都可以读或写入表。
保护所有者过程可以读写到表。其他过程只能读取表。这是访问权限的默认设置。
私人只有所有者进程可以读或写入表。