問題タブ [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 投票する
2 に答える
295 参照

process - trap_exit の Erlang 代替?

gen_server が停止しているときにコードを実行したいと考えています。gen_server トラップ出口があります ( process_flag(trap_exit, true)init コールバックに追加しました)。terminate/2これは、プロセスが終了する前に常に呼び出されるため、うまく機能します。リンクされたプロセスの終了をトラップしているため、クラッシュしても、作成した gen_server はクラッシュしないことがわかっています。私はこれを回避することができますが、process_flag(trap_exit, true)これを達成するために使用する代替手段があるかどうか疑問に思っていますか?

「プロセスが終了する前」のコールバックが必要です。この出口のようなものは他にありますか?

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

erlang - Erlang の基本的な一般的なサーバー デバッガーの出力の解釈

Erlang モジュールで問題が発生しています。これが私が書いたものです:

-module(basic_gen_server)。-export([start/1, call/2, cast/2]).

定義されたコールバック モジュールは次のとおりです。

次のコマンドでサーバーを初期化しようとしたとき:

次のデバッグ出力が得られます。

概念的には、シリアル コードを基本的なサーバー システムにするという概念は理解していますが、構文の強調表示や Google を使用しても見つけられなかった構文エラーがあると思います。助けてくれてありがとう!

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

erlang - Erlang: 長時間実行される init コールバックを処理するには?

監視ツリーの監視者gen_serverの下で、開始時に特定の数 (通常は 10 ~ 20) の子プロセスを開始しようとします。supervisor:start_child/2必要な子プロセスごとに、gen_server の init コールバックが呼び出されます。への呼び出しsupervisor:start_child/2は同期的であるため、子プロセスが開始されるまで戻りません。すべての子プロセスも gen_servers であるため、init コールバックが戻るまで start_link 呼び出しは戻りません。init コールバックでは、サードパーティ システムへの呼び出しが行われ、応答に時間がかかる場合があります (この問題は、サードパーティ システムへの呼び出しが 60 秒後にタイムアウトになったときに発見されました)。その間、init 呼び出しがブロックされました。つまり、supervisor:start_child/2もブロックされます。したがって、呼び出した gen_server プロセス全体supervisor:start_child/2無反応です。start_child 関数が戻るのを待っている間に gen_server タイムアウトを呼び出します。これは簡単に60秒以上続く可能性があるためです。アプリケーションが待機中に半開始状態で中断されているため、これを変更したいと思います。

この問題を解決する最善の方法は何ですか?

考えられる唯一の解決策は、サードパーティ システムと対話するコードを init コールバックから handle_cast コールバックに移動することです。これにより、init コールバックが高速になります。欠点は、gen_server:cast/2すべての子プロセスが開始された後に呼び出す必要があることです。

これを行うより良い方法はありますか?

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

erlang-otp - escript で Elixir Supervisor を実行する方法

スーパーバイザーと GenServer を可能な限りシンプルに組み合わせたプロジェクトがあります。iex から呼び出す場合:

:mumble 呼び出しで例外が発生し、GenServer が再起動され、2 番目の :echo 呼び出しが正常に機能します。

他の方法でコードを実行すると、Supervisor は GenServer の再起動に失敗します。たとえば、次のようにメイン モジュールを使用してプロジェクトの escript を作成します。

:mumble 呼び出しで例外が発生し、Supervisor が GenServer を再起動することなく escript が終了します。

Supervisor モジュールと Server モジュールのコードは含めていません。これらは iex から呼び出されたときに正常に動作するためです。ここでは不要だと思います。

概念的な誤解がありますか? これは不可能ですか、それとも何か間違っていますか?

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

erlang - Erlang でパターンが一致しない

私はこの電話をかけています:

そして、私はそれが以下と一致することを期待しています:

ただし、常に次のようになります。

どうしたの?

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

dictionary - Erlang tcpサーバーの投票キック

既存のサーバーに追加する簡単な投票キック オプションを作成しようとしています。

gen_server を使用するメッセージ ルーターがあり、これは を使用して接続されているすべてのクライアントを格納しますinit([]) -> {ok, dict:new()}。ルーターは、gen_server でもある tcp サーバーとは別のものですが、ルーターに中継される tcp 要求を処理します。

「もの」は別々に処理/保存されているので、キックされるユーザー、投票者のリスト、およびそれが成功したかどうかを保存したいと思います。したがって、これは少なくともルーター内でグローバルである必要があり、理想的にはクライアントの辞書から分離する必要があります。

最善/理想的なアプローチに関するアイデアはありますか?
キックする人々をレコード構造 {kick, {Votes, Passed}} に格納する別の gen_server 「ルーター」を作成できると思いますが、それが理想的かどうかはわかりません。

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

apache - Erlang inets httpc はローカル inets httpd に接続します

プロセスの HTTP get 要求を処理する httpd を使用してモジュールを実装しようとしています。基本的に、受信した get リクエストを処理し、get パラメータを解析し、http サーバーを起動したノードで同期 gen_server メソッドを呼び出します。次に、同期呼び出しからの戻り値を含む HTML を返します。ブラウザでテストするまで、すべて正常に動作します(Chrome、Firefoxの最新バージョンが動作しています)。しかし、HTTP サーバーが指定されたパラメーターで他の URL を呼び出すことができる HTTP 転送機能を実装する必要があります。私はhttpcでそれを試しました:

しかし、次のエラーがスローされました:

私を助けてくれませんか?私は何が欠けていますか?

Ps。stackoverflow.com上記の作業など、他のサイトhttpc:request(...)

構成: node.erl を開始し、ノードは別のモジュールで httpfront.erl httpd デーモンを開始し、get 要求は httpfront で処理されます。私はこれを数回行います(より多くのノードを開始します)。今、ある httpfront インスタンスから httpc:request(...) を使用して別のインスタンスに接続したいと考えています。すべての HTTP ハンドラーは localhost で開始されますが、独自のポートではありません。

node.erl:

httpfront.erl:

最後に、私が述べたように、他のノードからこれを呼び出そうとしましたが、エラーが発生しました:

ヘルプやアドバイスをいただければ幸いです。ありがとうございました。