問題タブ [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.
callback - 初心者のためのErlang/OTPの動作
「ErlangとOTPの動作」の本から理解したように、動作という言葉は次のことを指します。
- 関数のセットである動作インターフェース。
- アプリケーション固有のコード(コールバックモジュール)である動作の実装。
- プロセスである動作コンテナ。
質問:
Erlang / OTPの初心者は行動について何を知っておくべきですか?OTPの動作の概念を簡単に説明して理解することは可能ですか?
Elang / OTPのコンテキストで実際に「コールバック関数」とはどういう意味ですか?
ビヘイビアー実装のコールバックを、Javaでオーバーライドされたメソッドと見なすことができますか?
この本は、次のコードのライブラリ関数'gen_server:start_link / 4'に関連付けられているコールバック関数は'Module:init/1'であると述べています。
これは、init / 1でgen_server:start_link / 4ライブラリ関数を呼び出すことを意味しますか?それとも他に何か意味がありますか?
erlang - Erlang の gen_fsm:start/3 の一意のアトム
私は現在、ゲームサーバーを作成するプロジェクトに参加しています。すべてのプレイヤーは、gen_fsm 動作を備えた独自のプロセスを持っていると想定されています。start/3 で gen_fsm を開始するには、一意のアトムが必要です。現在、make_ref() を使用して、この ref を ref_to_list/1 でアトムにする方法を見つけました。しかし、この投稿によると、それは推奨されておらず、私は彼に同意します.
この問題をどのように解決しますか?local オプションで gen_fsm を開始するとき、それを識別するためのアトムが必要です。
erlang - 監督者の行動
スーパーバイザーを実装するとき..スーパーバイザーモジュールで、次のようなことをすると
init([_]) ->
{ok,
{{one_for_one, 5, 60},
[{reverse, {reverse, start_reverse, []}, permanent, brutal_kill, worker,[]}]}}.
逆関数は次のとおりです。
start_reverse() ->
Pid=spawn(?MODULE,reverse,[])。
どの場合でも start_reverse 関数は正常に終了するため、機能しません。ただし、次のような行を追加すると:
start_reverse() ->
Pid=spawn(?MODULE,reverse,[]),
{ok,Pid}.
関数が正常に終了した場合でも機能します。誰かが理由を説明できますか?
erlang - Erlang: スーパーバイザーで起動すると gen_server がクラッシュする
だから、私は多くの時間を費やしましたが、それでも答えは見つかりませんでした.
gen_server に単純な tcp サーバーがあり、telnet 経由でメッセージを受け取り、コンソールに出力します。
そしてスーパーバイザー:
これを erlang コンソールで開始します。
そして、これを取得します:
これは、スーパーバイザーが何らかの理由でサーバーをシャットダウンしたことを意味します。サーバーを単独で起動すると (st_server:start_link.)、問題なく動作します。
問題は、シャットダウンせずにこれを機能させる方法です。
erlang - Erlang で OTP を使用する理由
質問が言ったように: Erlang で開発するときに OTP 設計原則を使用すると、どのような利点がありますか?
コマンドを受信して応答を送信するだけのサーバーを開発しています。
erlang - ErlangアプリのGUIフロントエンドとしてNitrogenを使用するにはどうすればよいですか?
コマンドラインで起動する基本的なサーバー側のErlangアプリ(まだ完全にOTPされていません)があります。ブラウザを窒素(バージョン2.0.4)のGUIとして使ったインタラクティブシステムにしたいと思います。一般的な計画は
- 現在のモジュールをMODEL部分としてgen_serverに変換します。データを分析し、関心のあるデータの特定のプロパティを反映するイベントを生成します。
- gen_event(モデルによって生成されたイベントを取得するため)とgen_server(GUIフロントエンドからのクエリを許可するため)の両方であるCONTROLLERモジュールを追加します
- 窒素をビューとして使用し、コントローラーモジュールへの呼び出し(モデルにクエリを実行する)を通じて、関連するページをAjax機能で更新します。
私が見る限り、モデル、ビュー、コントローラーの3つの子を持つ一般的なアプリケーションスーパーバイザーが必要です。次に、OTP通信モードにマップされたAPIを介して相互に通信します。
そして、これは私が立ち往生しているところです:私はこれらすべてを窒素ディレクトリツリーに入れるべきですか?新しいアプリディレクトリ構造を設定し、その下に3つのコンポーネント(窒素を含む)を含める必要がありますか?アプリスーパーバイザーの子としてNitrogenサーバーを起動するには、正確に何をする必要がありますか(Nitrogen起動スクリプトは予想よりもかなり複雑に見えます)?ErlangとOTPinActionを使い始めましたが、まだ完了していません。そして、明後日、システムのデモを行う必要があります;)
コマンドラインで「start.sh」と入力し、ブラウザーを使用して窒素経由でアプリに接続します。
erlang - Erlang/OTP: 同期 vs. 非同期メッセージング
そもそも Erlang に惹かれたものの 1 つは Actor モデルです。異なるプロセスが同時に実行され、非同期メッセージングを介して相互作用するという考え。
私は、OTP に慣れ始めたばかりで、特に gen_server に注目しています。私が見たすべての例は、モジュールの動作を実装するhandle_call()
のではなく、チュートリアルタイプの例であることを認めています。handle_cast()
私はそれが少し混乱していると思います。私が知る限りhandle_call
、同期操作です。呼び出し元は、呼び出し先が完了して戻るまでブロックされます。これは、非同期メッセージ パッシングの哲学に反しているようです。
新しい OTP アプリケーションを開始しようとしています。これは基本的なアーキテクチャ上の決定のように思えるので、着手する前に理解しておく必要があります。
私の質問は次のとおりです。
- 実際には、人々は?
handle_call
ではなくhandle_cast
?を使用する傾向があります。 - もしそうなら、複数のクライアントが同じプロセス/モジュールを呼び出すことができる場合、スケーラビリティへの影響は何ですか?
erlang - init で self() にメッセージを送るのは悪いことですか?
この例では、作成者は次のようにしてデッドロック状態を回避します。
self() ! {start_worker_supervisor, Sup, MFA}
彼の gen_server の init 関数で。私は自分のプロジェクトの 1 つで同様のことを行いましたが、この方法は眉をひそめ、代わりにすぐにタイムアウトを発生させる方がよいと言われました。受け入れられたパターンは何ですか?
erlang - 何度も設定ファイルを読むか、gen_serverステータスを使用しますか?
gen_server と gen_fsm を使用して OTP システムを実装しました。ソフトウェアを実行するために必要ないくつかの値を読み取る構成ファイルがあります。例は次のとおりです。
マクロを使用してこれらの値の 1 つを抽出しました
問題は次のとおりです: ?VALUES は非常に頻繁に呼び出される可能性があるため、構成ファイルは何度も解析されるため、gen_fsm の gen_server の状態内に ?VALUES を埋め込み、必要なときにいつでも呼び出しで抽出する必要がありますか?
実際、#state{} の変更や呼び出しを行わなくても、構成ファイル内の値を変更するだけでソフトウェアの動作を変更できるため、以前の実装には本当に感謝しています。
あなたはどのソリューションを好みますか?
erlang - Erlang メッセージで送信できる型の種類は?
主に、Erlang の分散セットアップで関数をメッセージで送信できるかどうかを知りたいです。
マシン 1:
マシン 2:
それは理にかなっていますか?