問題タブ [gen-fsm]
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 - gen_fsm erlang タイムアウト
gen_fsm タイムアウトについて質問があります。2 つの状態を持つ gen_fsm のセットがあるとしましょう (将来はそれ以上になる可能性があります):idle
これは開始状態とworking
.
gen_fsm は 5 秒ごとに特定のパラメータをチェックし、それに従って に留まるか、idle
または に移動しworking
ます。gen_fsm が に移動するときはいつでも、working
メッセージを ( を使用してgen_fsm:send_all_state_event/2
) 他のすべての gen_fsm にidle
送信working
しworking
ます。
ここで重要なのは、ステート タイムアウトに偏りを持たせたくないということです (たとえば、マシンがworking
3 秒間待機してメッセージを受信するとどうなるでしょうか? 5 秒のタイムアウトは有効ではありません。何があっても一定のタイムアウト (これは、一定の時間にタイムアウト メッセージをトリガーする必要があることを意味します)。
now()
とを使用する私のソリューションの重要な部分は次のとおりtime:now_diff/2
です。とにかく小さなドリフトがありますが、ほんの数秒について話しているので、公平に思えます。
それは有効だと思いますか?
erlang - gen_server/gen_fsm をノードからノードに転送する方法
gen_server/gen_fsm を erlang ノード A から erlang ノード B に移動し、その内部状態を保持するための推奨される方法 (ある場合) を知りたいです。
unit-testing - タイムアウトの eunit テスト
gen_fsm が実際に eunit でタイムアウトすることをテストするにはどうすればよいですか?
erlang - gen_fsm の状態を別のモジュールの関数に変更する
Erlang の gen_fsm モジュールを使用してメニュー オプションを管理するかなり大きな USSD アプリケーションがあります。
menus_fsm.erl
現在のバージョンには、 5000 行以上の gen_fsm 関連コードを含む単一のファイルがあります。menus_fsm.erl
次のバージョンでは、個別のファイルに分割して、将来の保守を容易にする機会が与えられます。
古いバージョンでは、ヘルプ メニューを表示するには、次のようにします (help_menu/1
メイン メニューを表示する図示されていないコードから呼び出されます)。
FSM へのエントリ ポイントなどを示す多くのコードを省略しました。
新しいバージョンでは、次のように、から呼び出される新しいモジュールにhelp_menu/1
とを移動したいと考えています。waitHelpMenuChoice/2
help_menu
menus_fsm
問題は次の行にあります{next_state, waitHelpMenuChoice, StateData, ?MENU_TOUT};
:モジュールにあることがgen_fsm
期待されているため、開始した場所に戻ります。waitHelpMenuChoice
menus_fsm
問題のある行を次のように置き換えようとしました
しかし、それは次のようなエラーにつながるだけです:
{badarg,[{erlang,apply,[conv_fsm,#Fun<help_menu.waitHelpMenuChoice.2>,[]]}
これを回避する方法について何か提案はありますか?
erlang - Erlang - スーパーバイザーと gen_fsm での例外終了
calculadora
、log_calculadora
およびの3 つのモジュールがありsupervisor_calculadora
ます。Calculadora
gen_fsm を使用して合計、減算、乗算、および除算を行う単純な計算機であり、スーパーバイザーはスーパーバイザーの動作を実装します。Calculadora はうまく動作calculadora
しますが、除算 0/0 または例外を作成したときにモジュールを再起動する必要があるスーパーバイザーを試してみると、機能しません。なんで?
PD: モジュールlog_calculadora
は、私が行った操作をcalculadora
log.txt ファイルに書き込むだけです。TEST モジュールは、私に例外終了を与えるモジュールです。
電卓:
スーパーバイザー:
テストモジュール
erlang - この場合、どのErlangの動作、つまりgen_serverまたはgen_fsmを使用する必要がありますか
特定のトランザクションについて SOAP Web サービスにクエリを実行するソリューションを開発しています。これらのトランザクションは、取得されるとデータベースに保存され、その後コールバック URL が呼び出されてデータが別のサーバーに送信されます。この問題の解決策をどのように設計するのが最善でしょうか? 私の混乱のポイントは、gen_server または gen_fsm のどちらを使用する必要があるかということです。使用する場合、ソリューションのどのコンポーネントがどこに行くのか、つまり gen_server の場合、どのタスクがサーバーに送られ、どのタスクがクライアントに送られるのかということです。