2017-02-23 7 views
1

最初に免責事項私はerlangを学んでいます。ここでは専門家ではありません。 ETSを使用していくつかの例を作成しているうちに、私は何かを見つけたが、私は理解していない(検索した後でも)。シェルの有無にかかわらずETSの異なる動作

私はその後、他のプロセスにTABLEIDを渡す私は

TableID = ets:new(tablename, [public])} 

と公共ETSを作成するプロセスを持っています。私がこれを実行すると、モジュールがシェルを形成し、すべてがOKです。 erl -noshell -s ...または-noshellオプションを指定しなくても、同じモジュールを正確に実行すると失敗します。 エラーが続きます:テーブルが存在しないかのようなbadargです。 IDは正しく渡されますが、テーブルは実際にプライベートとして動作しています!

シェルからモジュールをインタラクティブに実行する場合と実行しない場合の違いはありますか?

おかげ


私は私がしようとすると、問題をデバッグするために使用していたコードの例を追加しています。それは大きなソフトウェアの一部であり(基本的には問題を見つけるために骨から剥がされている)、理解するのが難しいかもしれません。

-record(loop_state, { 
     commands 
     }). 

start() -> 
    LoopState = #loop_state{commands = ets:new(commands, [public])}, 
    tcpserver_otp_backend:start(?MODULE, 7000, {?MODULE, loop}, LoopState). 

loop(Socket, LoopState = #loop_state{commands = Commands}) -> 
    case gen_tcp:recv(Socket, 0) of 
     {ok, Data} -> 
      % the call below fails, no error generated, AND only in non interactive shell 
      A = newCommand(Commands, Data), 
      gen_tcp:send(Socket, A), 
      loop(Socket, LoopState); 
     {error, closed} -> 
      ok 
    end. 


newCommand(CommandTableId, Command) -> 
    case ets:lookup(CommandTableId,Command) of 
     [] -> 
      _A = ets:insert(CommandTableId, {Command, 1}), 
      <<1, "new", "1">>; % used for testing 
     _ -> 
      <<1, "old", "1">> % used for testing 
    end. 

私は「怒っているコマンド」を削除します:ルックアップはすべて、再びインタラクティブシェルとして動作します。

+0

エラー状況を再現するために関連するコードを投稿できますか? –

+0

完了、私はそれが私が間違っていることを理解しようとするために使用している部分だけを残して少しそれをきれいにしようとしました。 – Francesco

答えて

2

問題は、あなたのstart()関数にetsテーブルを作成しているようです。 etsテーブルには所有者(デフォルトでは作成プロセス)があり、所有者がなくなるとテーブルが削除されます。コマンドラインから-sをerlに渡してstart/0関数を実行すると、Erlangカーネルの内部プロセスが起動シーケンスの処理の一部になります。 -noshellを渡すかどうかに関わらず、そのプロセスはおそらく一時的なものであり、lookup関数の実行に時間がかかる前に終了するため、最終的にルックアップが発生したときにテーブルは存在しなくなります。

etsテーブルを作成する適切な場所は、起動するgen_serverのinit()コールバック関数です。複数のプロセスによってアクセスされる公開されたテーブルでなければならない場合、タスクを持つ別のサーバープロセスを作成してテーブルを所有することができます。

+0

私は、解決策が解決した問題が正しいと思います。これを例にとれば、別のデータ構造を使用するか、独自のプロセスでETSをカプセル化するだけです。 – Francesco

+0

興味深い小さな論文があります(http://steve.vinoski.net/blog/2011/03/ 23/dont-lose-your-ets-tables /):この題目について、あなたのetsテーブルを失ってはいけません。 – Pascal

関連する問題