問題タブ [erlang-otp]
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アプリケーションの問題
Erlangプログラムにアプリケーションを書こうとしています。
私はtest_app.erlを持っています:
そして.appファイル:
アプリケーションを起動しようとすると:
エラーが発生します:
どうしたの?どうすれば修正できますか?
私がeshellで作る場合:
すべての作品より。
ありがとうございました。
erlang - gen_server 状態のクリーンアップの処理
gen_server
正常に停止したり、予期せずクラッシュしたりするたびに、状態をクリーンアップする必要がある実行中です。クリーンアップは、基本的にいくつかのファイルを削除することから成ります。
この時点で、gen_server
クラッシュまたは正常に停止すると、 でクリーンアップが行われterminate/2
ます。
クラッシュterminate/2
した場合に呼び出されない理由はありますか?gen_server
予期せずgen_server
終了した場合、クリーンアップを実行するのを待機している他のプロセスを監視する必要がありますか?gen_server
したがって、コードは次のようになります。
編集:公式のメーリングリストで同じことについて話しているこのメールを見つけました:
http://groups.google.com/group/erlang-programming/browse_thread/thread/9a1ba2d974775ce8
Adam が以下で述べているように、exists を にトラップすることを避けたい場合は、gen_server
別のアプローチを使用できます。
しかし、exists をトラップするterminate/2
と、常に呼び出されるため、クリーンアップを行うのに安全な場所と思われます。さらに、'EXIT'
が送信されterminate/2
たときに正しく処理しhandle_call/3
、ワーカーとスーパーバイザーの間でエラーを正しく伝達する必要があります。
erlang - Erlang HTTPクライアント:inetsまたはibrowseまたは...?
私はErlangを使用しており、効率的なHTTPリクエストを作成する必要があります。
Erlang / OTPの現在の「標準」HTTPクライアントは何ですか?
それは完全にinetsまたはibrowseまたは何か他のものですか?
アドバイスやアドバイスをいただければ幸いです。
architecture - Erlang OTP アプリケーションの設計
一部のコードを OTP アプリに変換するときに、OTP 開発モデルを理解するのに少し苦労しています。
私は基本的に Web クローラーを作成していますが、実際の作業を行うコードをどこに置くべきかよくわかりません。
ワーカーを開始するスーパーバイザーがあります。
この設計では、クローラー ワーカーが実際の作業を担当します。
do_crawlは、http を介したクロール作業を処理するかなり多数のプロセスとリクエストを生成します。
質問は最終的に次のとおりです。実際のクロールはどこで行われるべきですか? 上で見たように、私は実際の作業をトリガーするさまざまな方法を試してきましたが、物事を組み合わせる方法を理解するために不可欠な概念がまだいくつか欠けています。
注: OTP 配管の一部は簡潔にするために省略されています。配管はすべてそこにあり、システムはすべて一緒にハングします。
erlang - 動的スーパーバイザーで終了した子の仕様を原子的に削除する方法
この質問には USB の知識は必要ありません。例をより具体的にするために説明しただけです。
USB バス上の特定のデバイスに動的スーパーバイザを実装しようとしています。これらのデバイスにはアドレスがあり、システムの存続期間中に現れたり消えたりします。
デバイスごとに、スーパーバイザーの動的な子が必要です。
これらの子は一時的なものであるため、いったんクラッシュまたは終了すると、再起動しません (おそらくその時点でなくなっているため)。
特定の時間に USB ポートをスキャンし、処理したい USB デバイスのすべてのアドレスのリストを生成するプロセスがあります。
supervisor:which_children/1
各スキャンの前に呼び出して、存在するが子プロセスが実行されていないデバイスを見つける予定です。
実行中の子を持つアドレスを見つけるために、アドレスを含む childspec の Id アトムを作成する予定です (可能なアドレスはわずかしかありません)。たとえば adr_12
、子が address を処理する場合12
です。
行方不明の子を開始/再起動しようとすると、一時的な子が終了またはクラッシュしたときに子仕様が自動的に削除されないというやや醜い状況があります (少なくともそうであると思います)。したがって、次のようなコードが必要になります。
supervisor:which_children/1
次に、すでに終了した子供も返すかどうかわからないという問題があります。
そのため、一時的に終了した後に子を削除するのが最善です。
どういうわけか、これはすべて私にとってエレガントではないので、私は自分自身(そしてあなた)に尋ねています:
これを最もエレガントに解決するにはどうすればよいですか?
この状況では、スーパーバイザをまったく使用しない方がよいでしょうか?
erlang - Erlang を SUSE にインストールする
openSUSE 11.4 (または類似のもの) に Erlang をインストールする方法についてのガイドを持っている人はいますか?
erlang - 子を再起動している間、スーパーバイザーは通話をブロックしますか?
ここで何が起こっているのかを理解しようとしています:
MaxR, MaxT
メカニズムをトリガーせずに 1 つのクライアントを周期的に再起動しているスーパーバイザがいます。クライアントは、レート制限をトリガーしないほどゆっくりとクラッシュします。
supervisor:which_children/1
子のセットを使用して実際に適応させる別のメカニズムがあったはずdelete_child/2, start_child/2
です (USB デバイスをスキャンして、見つかったデバイスごとに 1 つのスーパーバイザーの子を持たせようとします)。
これは通常、レート制限に対するセーフティ ネットのように動作しますが、奇妙なことに、子を削除して開始するメカニズムがまったく呼び出されないように見えます。
何が起こっているのかを知るためにsupervisor:which_children/1
、シェルから呼び出しましたが、呼び出しがブロックされ、返されないように見えます。
スーパーバイザが子を再起動しようとしている間、スーパーバイザへの呼び出しがブロックされる可能性はありますか?
補遺:
子の開始中にクラッシュが発生したようです:
erlang - 到達したスーパーバイザーが、問題のある子のみを削除するにはどうすればよいですか?
私には、one_for_one
似たような完全に独立した子供を扱う監督者がいます。
1人の子供に問題がある場合、クラッシュとトリガーを繰り返します。
自分自身をシャットダウンし、それ以外の場合は正常に実行し続けるすべての無実の子供たちを終了させます。
標準のErlangスーパーバイザーから監視ツリーを構築するにはどうすればよいですか?これは、問題のある1人の子の再起動を停止し、他の子をそのままにします。
一人っ子で上司を増員することを考えていましたが、これは私には重いようです。
これを処理する他の方法はありますか?
erlang - Erlang クラスター内のすべてのノードで gen_server を実行する最良の方法は何ですか?
Erlang で監視ツールを構築しています。クラスターで実行する場合、すべてのノードで一連のデータ収集機能を実行し、単一の「レコーダー」ノードで RRD を使用してそのデータを記録する必要があります。
現在のバージョンには、マスター ノード ( rolf_node_sup
) で実行されているスーパーバイザがあり、クラスタ内の各ノードで 2 番目のスーパーバイザを実行しようとします ( rolf_service_sup
)。次に、ノード上の各スーパーバイザは、マスター ノードの gen_server にメッセージを送信する一連のプロセスを開始および監視する必要があります ( rolf_recorder
)。
これはローカルでのみ機能します。どのリモート・ノードでもスーパーバイザーは開始されません。次のコードを使用して、レコーダー ノードからノード上のスーパーバイザーをロードしようとします。
スーパーバイザーは実際にはローカル プロセス専用に設計されていると示唆する人を何人か見つけました。例えば
クラスター内のすべてのノードで監視されたコードを実行するという私の要件を実装するための最も OTP の方法は何ですか?
- 分散アプリケーションは、分散スーパーバイザ ツリーの代替案の 1 つとして提案されています。これらは私のユースケースには合いません。ノード間のフェールオーバーを提供しますが、一連のノードでコードを実行したままにします。
- プールモジュールは興味深いものです。ただし、すべてのノードではなく、現在最も負荷の低いノードでジョブを実行できます。
proc_lib:spawn_link
別の方法として、各ノードでスーパーバイザを起動するために使用する、監視対象の「プロキシ」プロセスのセット (ノードごとに 1 つ) をマスター上に作成することもできます。ノードで何か問題が発生した場合、プロキシ プロセスは終了し、そのスーパーバイザによって再起動され、リモート プロセスが再起動されます。ここでは、 slaveモジュールが非常に役立ちます。- または多分私は過度に複雑です。ノードを直接監視するのは悪い考えです。代わりに、より疎結合の方法でデータを収集するようにアプリケーションを設計する必要があります。複数のノードでアプリを実行してクラスターを構築し、1 つをマスターに指定して、そのままにしておきます。
いくつかの要件:
- アーキテクチャは、手動で介入することなく、プールに参加したりプールから離れたりするノードに対処できる必要があります。
- 簡単にするために、少なくとも最初はシングルマスターソリューションを構築したいと思います。
- 私の実装では、手巻きのコードよりも既存の OTP 機能を使用したいと考えています。
erlang - Erlangメッセージキューはプロセス間で永続的ですか?
これは簡単な質問のはずですが、答えを見つけるのに十分なほどドキュメントを回避する方法がわかりません。
クラッシュした後に OTP スーパーバイザが gen_server を再起動した場合、新しい子プロセスはクラッシュしたプロセスのメッセージ キューを継承しますか、それともメッセージはクラッシュ前に送信されますが、フロアにドロップされた古い子によってまだ処理されていませんか?