【问题标题】:Share ETS table with two processes?与两个进程共享 ETS 表?
【发布时间】:2012-10-18 05:32:01
【问题描述】:

我在一个进程中创建 ETS 表,我想在另一个进程中使用它。我如何在第二个过程中“打开”ETS 表?在手册页中找不到好的功能。

【问题讨论】:

  • 不发布这个作为答案,因为我没有使用 ETS 的经验,但只要所有进程都在同一个 VM 上,您应该能够简单地引用正确的表名(原子)任何 ETS 函数调用。见:learnyousomeerlang.com/ets

标签: erlang ets


【解决方案1】:

您必须使用“named_table”和“public”选项创建 ets 表。

喜欢

T = ets:new(yourtablename,[public,named_table]).

在这种情况下,其他本地进程可以通过名称“yourtablename”使用此表。无需在其他进程中显式打开该表。

【讨论】:

  • 我可以从不同的模块访问它吗?我在做 ets:info(mytab,size) 并且在一个模块中大小为 1,但在其他模块中大小未定义。表名是准确的,我的声明如你所说
  • 添加,我使用原子名称:Tab = ets:new(mytab,[named_table,public,set])。因此,当我在最后一条评论中执行 info() 时,我使用 mytab 来调用表格大小
【解决方案2】:

如果您不希望您的表具有唯一的名称,您可以省略 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>

【讨论】:

    【解决方案3】:

    正如 Odobenus 和 legoscia 所说,您可以通过名称(将其命名为 named_table)或标识符(将标识符传递给其他进程)访问 ets 表,并将表公开。

    是否从另一个模块访问它没有区别。

    确保在执行 ets:info 时,表已经创建(由其他进程)。

    【讨论】:

      【解决方案4】:

      new(Name, Options) -&gt; tid() | atom() in here

      创建一个新表并返回一个可以在后续操作中使用的表标识符。表标识符可以发送给其他进程,这样一个表就可以在一个节点内的不同进程之间共享。

      public 任何进程都可以读取或写入表。

      protected 所有者进程可以读取和写入表。其他进程只能读取该表。这是访问权限的默认设置。

      private 只有所有者进程可以读取或写入表。

      【讨论】:

        猜你喜欢
        • 2012-10-14
        • 2019-04-02
        • 1970-01-01
        • 1970-01-01
        • 2011-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多