問題タブ [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.
erlang - gen_server は起動していますか?
gen_server に「スーパーバイザーがすべての gen_servers を初期化しました。メッセージを送信できるようになりました」と伝える方法はありますか?
監視ツリー内の他の gen_servers の状態を設定する仕事をしているワーカー gen_server がいます。構成サーバーの init 関数でメッセージの送信を開始すると、{noproc, _} になることがあります。これは、構成サーバーが速すぎたことを意味していると思います。スーパーバイザーがすべてのワーカーを開始するのに十分な時間がある前に、彼はメッセージを送信しました。config_server:init() に timer:sleep(500) を配置することでこれを修正しました。これにより、すべての gen_server が初期化するのに十分な時間が確保されますが、これは洗練されていないソリューションのように思えます。
これを行う適切な方法はありますか?
erlang - Erlang:拡張gen_server
いくつかの追加機能で拡張gen_server
(作成)したい。gen_server_extra
要件は次のとおりです。
- プロセスは通常の
gen_server_extra
ように動作する必要がありますgen_server
。たとえば、経由での通話の受け入れgen_server:call
、SASLとの統合、OTC監視ツリーの適合などが必要です。 gen_server_extra
プロセスには、によって提供される追加機能が必要gen_server_extra
です。これは基本的に、一部のメッセージがgen_server_extra
コールバックモジュールに渡されることなく、コードによって処理されることを意味します。残りのメッセージはそのままコールバックモジュールに渡されます。gen_server_extra
機能には、コールバックモジュールから非表示にする必要がある独自の状態が必要です。
それを行うための最も簡単なアプローチは何ですか?
erlang - gen サーバーの同期呼び出しと非同期呼び出し
非同期呼び出しのみを処理する gen_server があるとします (したがって、handle_cast のみが実装されます)。handle_call を保持して、一般的な ok 値のみを返すようにするか、またはコードのその部分を削除して警告を受け入れる必要がありますか?
erlang - gen_server を視覚的に説明するには?
免責事項: 著者は OTP の初心者であり、Erlang の構文、プロセス、およびメッセージに関する基本的な知識を持っています。
Erlang での動作の概念を理解しようとしていますが、gen_server のような動作の原理全体を理解するのを妨げる多くの疑問が頭に浮かびます。
さて、gen_server の公式ドキュメントには、クエリと応答の矢印で接続されたサーバーと 3 つのクライアントの素敵な図が示されています 。
しかし、その概念をさらに理解しようとするたびに行き詰まります。
頭の中で 1 つの大きな概念に組み込むことができない概念がたくさんあります。
- 動作の実装;
- 行動コンテナ;
- 動作インターフェイス;
- コールバック モジュール;
- コールバック関数;
- API 関数。
次のリソースを使用します。
- Erlang/OTP in Action book;
- OTP 動作プレゼンテーションの紹介、http://www.slideshare.net/gamlidek/ceug-introduction-to-otp-behaviors-part-i-genserver ;
- http://spawnlink.com/articles/an-introduction-to-gen_server-erlybank/index.htmlの「ErlyBank」。
私はまだ「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 (モデル)。ただし、モジュール、関数、およびプロセス間の相互作用は示していません。
erlang - gen_serverがリスニングソケットを閉じます
私がやろうとしているのは、gen_serverプロセスに新しいクライアントを受け入れさせ、すぐに新しい子を生成して次のクライアントを処理させることです。私が見ている問題は、ソケットが終了して結果的に終了すると、リスニングソケットも閉じて、参照しなくなっても理由がわからないことです。
私が間違っていることについて何か考えはありますか?
gen_server:
スーパーバイザー:
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 呼び出しからスタンドアロンでテストしているので、そのように起動します。
何か案は?
erlang - ErlangOTPスーパーバイザー
私はErlangプログラミングの本の演習12-2に取り組んでいます。OTPgen_serverの動作を実装するモジュールdb_server_otpがあります。スタンドアロンモジュールとして、私はそれをテストしました、そしてそれは期待通りに動作します。そのためのスーパーバイザーを追加する必要があります。この章の例に基づいて、次のようにモジュールdb_server_supを作成しました。
両方のモジュールは同じディレクトリにあり、.beamファイルを使用して両方のモジュールをコンパイルしました。erlangシェルを起動するのと同じ作業ディレクトリにあります。しかし、erlangシェルではスーパーバイザーを起動できません。
db_server_otpモジュールをインポートする必要がありますか?もしそうなら、どの関数をインポートする必要がありますか?私はすべてのOTPメソッドをdb_server_otpにエクスポートしています:
erlang - Erlang: スーパーバイザの下で複数のプロセスを生成する
私は単純なスーパーバイザーを実装しようとしていますが、失敗した場合は子プロセスを再起動するだけです。しかし、スーパーバイザーの下で複数のプロセスを生成する方法さえ知りません! このサイトで簡単なスーパーバイザー コードを調べたところ、何かが見つかりました
init() 関数に「echo_server2」の部分を配置すると、このスーパーバイザーの下で別のプロセスが生成されると想定しましたが、例外 exit:shutdown メッセージが表示されます。
ファイル「echo_server」と「echo_server2」は同じコードですが、名前が異なります。だから私は今混乱しています。
erlang - 長時間実行されるタスクを持つErlanggen_server
良い一日、
私gen_server
はいくつかの長期的な状態更新タスクを定期的に実行するプロセス
を持っていますhandle_info
:
しかし、そのようなタスクが実行されると、サーバー全体が応答しなくなり、それを呼び出すとサーバー全体がクラッシュします。
gen_serverのブロックを回避するにはどうすればよいですか?そして、いつでも1回呼び出すとmy_gen_server:status()
、結果は次のようになります。
{ok, task_active}
timer - gen_server:X 秒ごとに呼び出す
gen_server のステータスはリストであり、X 秒ごとに 1 回処理する必要があります。したがって、X 秒ごとに handle_call({process},State) を実行する必要があります。
X秒ごとにhandle_callを実行する最良の方法は何ですか?