[英]Share ETS table with two processes?
我在一个进程中创建ETS表,我想在另一个进程中使用它。 我如何在第二个过程中“打开”ETS表? 无法在手册页中找到好的功能。
你必须使用'named_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)]).
从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>
正如Odobenus和legoscia所说,您可以按名称访问ets表(使其成为named_table)或通过标识符(将标识符传递给其他进程),并将表公开。
是否从另一个模块访问没有任何区别。
确保在执行ets:info时,已经创建了表(由其他进程创建)。
new(Name, Options) -> tid() | atom()
new(Name, Options) -> tid() | atom()
在这里
创建一个新表并返回一个表标识符,该标识符可用于后续操作。 可以将表标识符发送到其他进程,以便可以在节点内的不同进程之间共享表。
public任何进程都可以读取或写入表。
protected所有者进程可以读取和写入表。 其他进程只能读取表。 这是访问权限的默认设置。
private只有所有者进程可以读取或写入表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.