あるプロセスで ETS テーブルを作成し、それを別のプロセスで使用したいと考えています。2 番目のプロセスで ETS テーブルを「開く」にはどうすればよいですか? マニュアル ページに適切な機能が見つかりませんでした。
4 に答える
「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)]).
シェルから試してください:
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()
ここで
新しいテーブルを作成し、後続の操作で使用できるテーブル識別子を返します。ノード内の異なるプロセス間でテーブルを共有できるように、テーブル識別子を他のプロセスに送信できます。
public すべてのプロセスがテーブルに対して読み取りまたは書き込みを行うことができます。
保護された所有者プロセスは、テーブルに対して読み書きできます。他のプロセスはテーブルを読み取ることしかできません。これは、アクセス権のデフォルト設定です。
private 所有者プロセスのみがテーブルの読み取りまたは書き込みを行うことができます。