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

timer - erlang タイマーがタイムアウトする

動作が gen_server の erlang モジュールがあります。

今私が持っています:

{ok, Test}=gen_server:start_link({local,challenge_manager},challenge_manager,[],[]).数秒後に次のようなもので開始すると、** exception error: {timeout,{gen_server,call,[<0.329.0>,{updateLvls}]}}

私は何か間違ったことをしていますか??

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

erlang - gen_server/gen_fsm をノードからノードに転送する方法

gen_server/gen_fsm を erlang ノード A から erlang ノード B に移動し、その内部状態を保持するための推奨される方法 (ある場合) を知りたいです。

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

error-handling - gen_server タイプのアプリケーションの状態の設定

特定の状態で gen_server を起動できるかどうかを調べようとしています。

このサーバーがクラッシュしたときに、最後の有効な状態でサーバーを再起動するモニター/スーパーバイザーをセットアップできるようにしたいと考えています。

この問題に取り組む方法についての提案は大歓迎です。

これまでのところ、私の唯一のアイデアは、呼び出されたときにサーバーの状態を目的の状態に変更する特別な handle_call/3 を用意することですが、サーバー モジュールの変更を避け、可能であればモニター/スーパーバイザー プロセスから純粋に処理したいと考えています。

お時間をいただきありがとうございます。

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

erlang - gen_server の監視

erlang:monitor/2 を使用して gen_server を監視しようとしています。残念ながら、これを試みるたびに、Erlang シェルは無限ループに陥ります。

これをテストするために書いたテストプログラムを次に示します。

上記のコードを使用して、この spawn(fun() -> ok end) (6 行目と 7 行目を変更) のようなものを監視すると、上記のコードは次のように機能します。意図されました。

誰かが私が間違っていることを教えてもらえますか? スーパーバイザ経由で gen_server プロセスを監視することしかできませんか?

ありがとうございました

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

ssl - Erlang + Apple プッシュ通知 [無効なトークンの問題]

現在、Erlang のプッシュ通知モジュールを作成しようとしています。

トークンが有効な場合、すべてが正常に機能します... 問題は、古いデバイス トークン (現在は無効) が拒否された場合です。無効なトークンは、apns によって 6 バイトのソケット メッセージで拒否され、接続が無効になることを理解しています (これは本当にばかげていると思いますが、何でも...)

問題は、制御プロセスがソケットをリッスンしていないように、APNS がモジュールで提供する必要がある 6 バイトのソケット メッセージを取得していないようです。

これが私のコードです:

したがって、モジュールを開始して有効なトークンにプッシュすると、電話でプッシュが受信されますが、無効なトークンにプッシュしてから有効なトークンにプッシュすると、有効なトークンはプッシュを受け取りません.. .

データベースからデバイス トークンを削除するには、フィードバック サービスをリッスンする必要があることは承知していますが、再接続するには、プッシュ ゲートウェイが接続を無効にしたかどうかも確認する必要があります。

本当の質問は次のとおりです。なぜ私の gen-server はエラー応答パケットを受信しないのですか (これは handle_info({ssl, Socket, Data}, P) と一致するはずです)。

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

erlang - Erlang スーパーバイザー。プロセスを再起動します。何度か失敗した場合は、あきらめてメッセージを送信します

gen_serverハードウェアセンサーからの情報を定期的に要求するワーカーが何人かいます。センサーが一時的に故障する場合がありますが、これは正常です。センサーが失敗した場合、ワーカーは例外で終了します。

simple_one_to_oneすべてのワーカーは、戦略を持つスーパーバイザーから生成されます。またgen_server、ワーカーを開始および停止し、'DOWN'メッセージを受信できるコントロールもあります。

だから今私は2つの問題があります:

  1. ワーカーがスーパーバイザーによって再起動されると、その状態が失われます。これは私には受け入れられません。同じ状態でワーカーを再作成する必要があります。

  2. ワーカーが一定期間に数回失敗する場合は、センサーに重大な問題が発生しており、オペレーターの注意が必要です。したがって、ワーカーの再起動をあきらめて、イベント ハンドラーにメッセージを送信する必要があります。ただし、スーパーバイザーのデフォルトの動作は、プロセスの再起動制限を使い果たした後に終了します。

2 つの解決策があります。

  1. スーパーバイザでプロセスのタイプを一時的に設定し、それらを制御して、制御で再起動しますgen_server。しかし、これはまさにスーパーバイザーが行うべきことなので、車輪を再発明しています。

  2. メイン スーパーバイザーの下に各ワーカーのスーパーバイザーを作成します。これは私の 2 番目の問題を正確に解決しますが、再起動後にワーカーの状態が失われるため、ワーカーの状態を格納する ets テーブルのようなストレージが必要です。

私は Erlang に非常に慣れていないので、(もしあれば) どの解決策が最適かについて、私の問題に対するアドバイスが必要です。前もって感謝します。

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

erlang - handle_call関数に「record=State」がある場合はどうなりますか?

gen_serverのhandle_call関数は次のとおりです。

しかし、私は次のような1つのhandle_call関数に遭遇します:</ p>

何が起こったのか知りたいですか?それは私の頭の上です

ところで:yuvレコードは:

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

sockets - gen_server ssl ソケットのメモリ フットプリントを削減する Erlang のヒントとコツ

Erlang gen_server ssl ソケット指向のメモリ フットプリントを削減する方法について、誰か考えがあるでしょうか?

現在、各クライアント (gen_server) のメモリには 128 Ko のようなものがあります。C ++では、クライアントごとに40 Koのようなものがあります。

お気に入り:

  • SSL暗号を変更すると、メモリフットプリントが変更されますか?
  • バッファサイズの変更?

メモリのフットプリントを大幅に削減するアイデアを本当に探しています!

編集 1: 私はすでに hibernate_after オプションを使用しています。

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

erlang - erlang io:format の出力が失われるのはなぜですか? また、それを復元するにはどうすればよいですか?

私は gen_server を書いていますが、これは単に gen_server_db と呼びますが、それほど特別なことは何もありません。使用するライブラリ (emysql) がデータベース サーバーを検索しようとしているときに (gen_server_db:init() で) 接続エラーが発生する可能性があります。例外をキャッチしてコンソールに何かを出力しようとすると、zip が表示されます。以下のコード サンプルの io:format メッセージはいずれも、コンソールに到達することはありません。ずっと前にこの理由を聞いたことを覚えているようですが、理由は思い出せません。

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

erlang - key-to-pid メカニズムを使用する場合の一時的な gen_servers 状態の保存を処理します

キーに関連付けられている一時的な gen_servers 状態の保存を処理する方法を知りたいです。

キーをプロセスに関連付けるために、pidstore というプロセスを使用します。Pidstore は最終的にプロセスを開始します。Key と M、F、A を pidstore に渡すと、グローバルでキーが検索され、見つかった場合は pid が返されるか、MFA が適用され ({ok, Pid} が返される必要があります)、Pid がキーに登録されます。グローバルで、Pid を返します。

おそらく巨大な状態の非アクティブな gen_servers が多数ある可能性があります。したがって、handle_info コールバックを設定して状態をデータベースに保存し、プロセスを停止しました。gen_servers はスーパーバイザーでは一時的なものと見なされるため、何かが再び必要になるまで再起動されません。

ここで問題が発生します: {car, 23} を表すプロセスで handle_info を保存するステップで、{car, 23} などのキーを使用してプロセスを呼び出すと、意図したとおりに pid が返されます。プロセスは保存中で、終了していません。したがって、gen_server:call でプロセスを呼び出しますが、プロセスが停止しているため、応答がありません (デフォルトの 5 秒のタイムアウトに達します)。(問題A)

この問題を解決するには、プロセスをグローバルから登録解除し、その状態を保存してから停止します。ただし、登録解除後、保存が完了する前に必要な場合は、新しいプロセスをロードします。このプロセスは、更新されていない値をデータベースにロードする可能性があります。(問題B)

これを再度解決するために、データベースへの読み込みと保存がキューに入れられ、同時に実行できないようにすることができました。これがボトルネックになる可能性があります。(問題C)

私は別の解決策を考えています.私のプロセスは、保存する前に、ビジーであることをpidstoreに伝えることができます. pidstore は、使用中のプロセスのリストを保持し、これらのキーに対するすべての要求に対して「使用中」と応答します。保存が完了すると、pidstore はプロセスによって no_more_busy と通知され、キーを要求されたときに新しいプロセスを開始できます。(古いプロセスが終了していなくても、保存が完了しているため、一人で死ぬのに時間がかかる場合があります)。

これは少し面倒に思えますが、可能性のあるタイムアウトを処理するために gen_server へのすべての呼び出しをラップする代わりに、キーから Pid を取得するためにいくつかの試行を行う方が簡単に感じます。(プロセスが終了しているが、まだグローバルに登録されている場合)。

これらの半分の問題と半分の解決策のすべてについて、私は少し混乱しています。この状況で使用する設計は何ですか、またはこの状況を回避するにはどうすればよいですか?

私のメッセージが判読できることを願っています。英語のエラーについても教えてください。

ありがとうございました