問題タブ [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 - Erlang: 2 つの gen_server をリンクできないのはなぜですか?
2 つの gen_server モジュールがあります。
最初のserv.erl
そしてuser.erl (init/1 以外は完全に同じです):
サーバーは永遠に続くと思っていました。最初のサーバーが停止すると、別のサーバーが{'EXIT', Pid, Reason}メッセージを受け取ります。
ただし、serv:start_link()でモジュールを開始すると、ユーザーモジュールは開始直後にメッセージ{'EXIT',Pid,normal} で終了します。ユーザーが死ぬのはなぜですか?
design-patterns - Erlang でキャンセルを実装する
長時間実行されるタスクを実行する gen_server があるとします。タスクをキャンセルするための最善かつ最もクリーンな方法は何ですか?
erlang - Erlang - ライブラリとサーバー
Erlang を勉強/プログラミングすればするほど、学ばなければならないことに気づきます。しかし、ここで、私が立ててきた仮定を確認または否定したいと思います。
2 つのモジュールを想定します。1 つをライブラリとしてパッケージ化します。もう 1 つはサーバーとしてパッケージ化します。質問: なぜ区別するのですか?
前提: 2 番目のモジュールの関数は、システムの残りの部分から分離された状態を維持するか、他の関数と同時に実行する必要があります。
これは本当で、モジュールをサーバーとしてパッケージ化する理由は 2 つだけですか?
ありがとう、
LRP
erlang - erlang: gen-server と状態
シーケンシャル Erlang の理解度をテストするための演習として、単純な html タグ エディターを作成しました。
テキスト内の現在の位置 (編集状態など) を次のようなレコードで維持します。
...ここで、a は現在の段落の上のテキストを保持し、b は現在の段落を保持し、c は現在の段落の下のテキストを保持します。
次のように呼び出されます。
関数 do/2 は、次のような再帰関数です。
このモジュールを OTP 生成サーバーに変えたいのですが、状態を維持する方法がよくわからないことに気付きました。
状態レコードを作成しました:
私の考えでは、1 対 1 のスーパーバイザーを使用して、各ユーザーが自分のプロセスで作業し、編集ループを捨て、handle_call (または handle_cast) を使用してそれぞれの編集関数を呼び出すことです。
しかし、私を混乱させるのはこれです:
プロセスが実行されている限り、おそらくユーザー状態はプロセス内で維持されますが、handle_call と handle_cast の両方がパラメータとして State を取り、State を返します。
これは、おそらくetsで、それぞれのプロセスの外側にある各ユーザーの状態も維持する必要があることを意味しますか?
または、これを完全に行うためのより良い方法はありますか?
どうもありがとう、
LRP
erlang - gen_server が httpc 呼び出し後にメッセージを取得しない
次のように、一時停止メッセージを gen_server に送信するプロセスが 1 つあります。
私の gen_server では、次のように handle_cast でこれらのメッセージをキャッチします。
本当に奇妙なのは、かなり頻繁に gen_servers の 1 つが一時停止メッセージを受信していないように見えることです。より大きなメッセージが表示されず、問題のプロセスはその後の一時停止 (または再開) の試行に応答しません。
何が起こっているのかについてのアイデアはありますか?
gen_server は非常に単純で、erlang:send_after/3 を使用して自分自身に「ポーリング」メッセージを送信します。このポーリング メッセージを受信すると、一時停止されていなければ、URL にヒットし、応答を ETS に保存し、別の erlang:send_after/3 を起動して、適切な間隔の後に再度ポーリングします。一時停止されている場合は、単純に別の erlang:send_after?3 を起動します。
すべての一時停止は、状態を一時停止 = true に設定することです
オブザーバーを使用すると、スタックしたプロセスは、現在の関数が httpc:handle_answer であり、メッセージ キューがバックアップされていることを示しています。
Sate タブ: 情報「タイムアウト」 ヒント「システム メッセージは、このプロセスでは処理されない可能性があります」
スタック トレースの上部に httpc:handle_answer httpc.erl:636 が表示されます。
erlang - gen_server からの no_proc 例外
以下のコードを実行すると、gen_server が例外を発生させます
出力:
上記のコードで何が問題になっていますか? drop モジュールをコンパイルした後、gen_server モジュールをコンパイルする必要がありますか?
erlang - Erlang gen_server の実装
以下のコードで、モジュールprime_server
がロードされないのはなぜですか?
出力:
erlang - タイムアウトのある Erlang gen_server プロセス
何時間も稼働する erlang gen_server プロセスを実装する必要があります。ただし、タイムアウト後に gen_server プロセスを強制終了する必要があります。これらのプロセスは動的に開始されるため、動的監視が使用されます。アイデアは、プロセスの初期化で timer:apply_after() を使用することです。したがって、gen_server プロセスの init は次のようになります。
私はアーランに少し慣れていないので、質問はこのアプローチがうまくいくか、それともいくつかの欠点があるかということです. より良い解決策はありますか?
ありがとう!
asynchronous - Erlang: gen_server:cast/2 と標準のメッセージ パッシングの使用の違い
私は問題に取り組んでいて、以前のプログラマーが PID の標準規則を使用してメッセージを渡しているコードに気付きました! メッセージ。私は gen_server:cast/2 を使用しています。この2つを選択する際の重要な違いと考慮事項を誰かが私に説明できるかどうか疑問に思っていましたか?