繁体   English   中英

与两个进程共享ETS表?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM