【发布时间】:2012-10-18 05:32:01
【问题描述】:
我在一个进程中创建 ETS 表,我想在另一个进程中使用它。我如何在第二个过程中“打开”ETS 表?在手册页中找不到好的功能。
【问题讨论】:
-
不发布这个作为答案,因为我没有使用 ETS 的经验,但只要所有进程都在同一个 VM 上,您应该能够简单地引用正确的表名(原子)任何 ETS 函数调用。见:learnyousomeerlang.com/ets
我在一个进程中创建 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 所说,您可以通过名称(将其命名为 named_table)或标识符(将标识符传递给其他进程)访问 ets 表,并将表公开。
是否从另一个模块访问它没有区别。
确保在执行 ets:info 时,表已经创建(由其他进程)。
【讨论】:
new(Name, Options) -> tid() | atom() in here
创建一个新表并返回一个可以在后续操作中使用的表标识符。表标识符可以发送给其他进程,这样一个表就可以在一个节点内的不同进程之间共享。
public 任何进程都可以读取或写入表。
protected 所有者进程可以读取和写入表。其他进程只能读取该表。这是访问权限的默认设置。
private 只有所有者进程可以读取或写入表。
【讨论】: