問題タブ [gen-server]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
848 参照

erlang - gen_server は起動していますか?

gen_server に「スーパーバイザーがすべての gen_servers を初期化しました。メッセージを送信できるようになりました」と伝える方法はありますか?

監視ツリー内の他の gen_servers の状態を設定する仕事をしているワーカー gen_server がいます。構成サーバーの init 関数でメッセージの送信を開始すると、{noproc, _} になることがあります。これは、構成サーバーが速すぎたことを意味していると思います。スーパーバイザーがすべてのワーカーを開始するのに十分な時間がある前に、彼はメッセージを送信しました。config_server:init() に timer:sleep(500) を配置することでこれを修正しました。これにより、すべての gen_server が初期化するのに十分な時間が確保されますが、これは洗練されていないソリューションのように思えます。

これを行う適切な方法はありますか?

0 投票する
2 に答える
736 参照

erlang - Erlang:拡張gen_server

いくつかの追加機能で拡張gen_server(作成)したい。gen_server_extra要件は次のとおりです。

  1. プロセスは通常のgen_server_extraように動作する必要がありますgen_server。たとえば、経由での通話の受け入れgen_server:call、SASLとの統合、OTC監視ツリーの適合などが必要です。
  2. gen_server_extraプロセスには、によって提供される追加機能が必要gen_server_extraです。これは基本的に、一部のメッセージがgen_server_extraコールバックモジュールに渡されることなく、コードによって処理されることを意味します。残りのメッセージはそのままコールバックモジュールに渡されます。
  3. gen_server_extra機能には、コールバックモジュールから非表示にする必要がある独自の状態が必要です。

それを行うための最も簡単なアプローチは何ですか?

0 投票する
2 に答える
354 参照

erlang - gen サーバーの同期呼び出しと非同期呼び出し

非同期呼び出しのみを処理する gen_server があるとします (したがって、handle_cast のみが実装されます)。handle_call を保持して、一般的な ok 値のみを返すようにするか、またはコードのその部分を削除して警告を受け入れる必要がありますか?

0 投票する
1 に答える
1042 参照

erlang - gen_server を視覚的に説明するには?

免責事項: 著者は OTP の初心者であり、Erlang の構文、プロセス、およびメッセージに関する基本的な知識を持っています。

Erlang での動作の概念を理解しようとしていますが、gen_server のような動作の原理全体を理解するのを妨げる多くの疑問が頭に浮かびます。

さて、gen_server の公式ドキュメントには、クエリと応答の矢印で接続されたサーバーと 3 つのクライアントの素敵な図が示されています

しかし、その概念をさらに理解しようとするたびに行き詰まります。

頭の中で 1 つの大きな概念に組み込むことができない概念がたくさんあります。

  • 動作の実装;
  • 行動コンテナ;
  • 動作インターフェイス;
  • コールバック モジュール;
  • コールバック関数;
  • API 関数。

次のリソースを使用します。

私はまだ「1つのモジュールで1つの関数を呼び出し、この関数は他の関数を呼び出し、その関数はプロセスを作成します...スタック」状態にあります

gen_server の概念を図で説明する方法はありますか? クライアントとサーバー間の対話フローを視覚的に示すにはどうすればよいでしょうか? (あまり賢くない初心者が概念を視覚的に理解できるようにするため)

たとえば、次のようになります: http://support.novell.com/techcenter/articles/img/dnd2003080506.gif

UPD:私は自分の図を描こうとしましたが、図のコネクタの目的をまだ理解していません: http://postimage.org/image/qe215ric/full/

UPD2: これは、私が見たいものに似たものです: http://cryptoanarchy.org/wiki/Worker_patterns (モデル)。ただし、モジュール、関数、およびプロセス間の相互作用は示していません。

0 投票する
2 に答える
2084 参照

erlang - gen_serverがリスニングソケットを閉じます

私がやろうとしているのは、gen_serverプロセスに新しいクライアントを受け入れさせ、すぐに新しい子を生成して次のクライアントを処理させることです。私が見ている問題は、ソケットが終了して結果的に終了すると、リスニングソケットも閉じて、参照しなくなっても理由が​​わからないことです。

私が間違っていることについて何か考えはありますか?

gen_server:

スーパーバイザー:

0 投票する
2 に答える
1068 参照

linux - Erlang、process_flag trap_exit は CLI から私の gen_server を強制終了します

私が使用しているこの gen_server があります。

問題は、次に示すように、cli から実行するとerl -pa ebin/ -s user_info_provider start_linkすぐに死ぬように見えますが、コンソールから起動して動作することです。

これは、設定しないかprocess_flag(trap_exit, true)、コンソールから直接起動しないと発生しません-s module function
実際の gen_server はもっと複雑で、Makefile 呼び出しからスタンドアロンでテストしているので、そのように起動します。
何か案は?

0 投票する
2 に答える
936 参照

erlang - ErlangOTPスーパーバイザー

私はErlangプログラミングの本の演習12-2に取り組んでいます。OTPgen_serverの動作を実装するモジュールdb_server_otpがあります。スタンドアロンモジュールとして、私はそれをテストしました、そしてそれは期待通りに動作します。そのためのスーパーバイザーを追加する必要があります。この章の例に基づいて、次のようにモジュールdb_server_supを作成しました。

両方のモジュールは同じディレクトリにあり、.beamファイルを使用して両方のモジュールをコンパイルしました。erlangシェルを起動するのと同じ作業ディレクトリにあります。しかし、erlangシェルではスーパーバイザーを起動できません。

db_server_otpモジュールをインポートする必要がありますか?もしそうなら、どの関数をインポートする必要がありますか?私はすべてのOTPメソッドをdb_server_otpにエクスポートしています:

0 投票する
2 に答える
1670 参照

erlang - Erlang: スーパーバイザの下で複数のプロセスを生成する

私は単純なスーパーバイザーを実装しようとしていますが、失敗した場合は子プロセスを再起動するだけです。しかし、スーパーバイザーの下で複数のプロセスを生成する方法さえ知りません! このサイトで簡単なスーパーバイザー コードを調べたところ、何かが見つかりました

init() 関数に「echo_server2」の部分を配置すると、このスーパーバイザーの下で別のプロセスが生成されると想定しましたが、例外 exit:shutdown メッセージが表示されます。

ファイル「echo_server」と「echo_server2」は同じコードですが、名前が異なります。だから私は今混乱しています。

0 投票する
2 に答える
4203 参照

erlang - 長時間実行されるタスクを持つErlanggen_server

良い一日、

gen_serverはいくつかの長期的な状態更新タスクを定期的に実行するプロセス を持っていますhandle_info

しかし、そのようなタスクが実行されると、サーバー全体が応答しなくなり、それを呼び出すとサーバー全体がクラッシュします。

gen_serverのブロックを回避するにはどうすればよいですか?そして、いつでも1回呼び出すとmy_gen_server:status()、結果は次のようになります。 {ok, task_active}

0 投票する
1 に答える
741 参照

timer - gen_server:X 秒ごとに呼び出す

gen_server のステータスはリストであり、X 秒ごとに 1 回処理する必要があります。したがって、X 秒ごとに handle_call({process},State) を実行する必要があります。

X秒ごとにhandle_callを実行する最良の方法は何ですか?