問題タブ [reactor]
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.
c++ - ACE Reactorは、中断されたシステムコールで終了します
ソケット接続を受け入れ、それらの接続で着信データをリッスンするACEリアクターがあります。反応器は専用のスレッドで動作します。これはスレッドのエントリ関数です。
たまにrun_reactor_event_loop
-1で終了しerrno
、理由が「システムコールの中断」であると報告します。どうすれば状況に対処できますか?私が知っていることから、2つのオプションがあります。もう一度呼び出すか、とを使用しrun_reactor_event_loop
て中断された呼び出しを再度呼び出すように構成します。sigaction
SA_RESTART
run_reactor_event_loop
もう一度電話しても大丈夫ですか?- ACE_Reactor :: restartメソッドは何をしますか?ループを再開することになっているように見えますか?それは役に立ちますか?
- 電源を入れるのはどれくらい安全
SA_RESTART
ですか?たとえば、^ Cがアプリケーションを停止しないということですか? - 状況を処理する他の方法はありますか?
python - 接続に失敗した後、Twisted-pythonReactorを再起動する
複数のクライアントでサーバーを作成しています。クライアントが起動したとき、サーバーはまだ機能していない可能性があります。したがって、areactor.connectTCP
は失敗する可能性があります(受信側がない)。現在、私はこれをループすることで解決していreactor.run
ます。
- サーバーに接続する
- react.run
- 失敗した場合は、繰り返します
私はこれがねじれた状態でそれを行う方法ではないことを理解しています。どうすればそれができますか?
python - ツイストリアクター:優先順位と洞察
ツイストリアクターに関する2つの簡単な質問:
タスクのスケジュール中に優先順位を明示的に割り当てる方法はありますか?
保留中のすべてのタスクを一覧表示するためにreactorを検査することは可能ですか?
tkinter - ねじれた電源サーバーで tkMessageBox をポップする方法
ねじれたリアクターに基づくサーバーがあり、次のシナリオが必要です。サーバーは2種類のリクエストを受け取ることができます
- ADD(x,y) を計算し、合計を返します
- 人間のユーザーがクライアントの IP を承認した場合にのみ true を返す HUMAN_PERMISSION
私は tkMessageBox を使用して人間のユーザーに尋ねていますが、問題はリアクター全体をブロックし、サーバーが他の要求に応答しなくなることです
ここで何らかの方法でtwistedのdeferredを使用する必要があることを理解していますが、これがどのように機能するかわかりません:動作していないようです、それでもリアクター全体をブロックします
python - 単一のプログラムで複数回起動するツイストリアクター?
同じプログラムで原子炉を複数回起動することはできますか? API の目的で、ねじれた機能をメソッド内にカプセル化するとします。
たとえば、mymodule.py は次のようになります。
main.py は次のようになります。
multithreading - ツイスト: 複数のスレッドとプロセスを一緒に使用する
Twisted のドキュメンテーションは、リアクターがカバーの下でこれをエレガントに処理するという同じアプリケーションで と のreactor.spawnProcess()
ようなテクニックを組み合わせても問題ないと私に信じさせました。threads.deferToThread()
実際に試してみると、アプリケーションがデッドロックすることがわかりました。複数のスレッドを単独で使用するか、子プロセスを単独で使用すると、すべて問題ありません。
リアクターのソースを調べると、実行中の可能性のある複数のスレッドを考慮せずにSelectReactor.spawnProcess()
メソッドが単純に呼び出されていることがわかりました。あなたへの呼び出しから始まると、複数の同時スレッドが実行され、同じファイル記述子で何を知っているかを知っている2つのプロセスがos.fork()
あるため、これはデッドロックを説明しています。os.fork()
SO に対する私の質問は、この問題を解決するための最善の戦略は何ですか?
私が念頭に置いているのは、 をサブクラスSelectReactor
化することです。これにより、シングルトンになりos.fork()
、インスタンス化されたときにすぐに 1 回だけ呼び出されます。子プロセスはバックグラウンドで実行され、親のサーバーとして機能します (パイプを介したオブジェクトのシリアル化を使用してやり取りします)。親は引き続きアプリケーションを実行し、必要に応じてスレッドを使用できます。親での呼び出しspawnProcess()
は子プロセスに委譲されます。子プロセスは 1 つのスレッドのみを実行することが保証されるため、os.fork()
安全に呼び出すことができます。
誰もこれを以前にやったことがありますか?もっと速い方法はありますか?
python - ツイストで複数のリアクターの必要性を回避する方法
qt4reactor を使用して Linux で Qt アプリケーションを実行しています。アプリケーションはシリアル ポートでバイトを送受信します。これは、QtReactor を使用する Linux で非常にうまく機能します。
ただし、アプリケーションを Windows に移植すると、問題が発生します。Windows では、_win32SerialPort の SerialPort クラスを使用します。_win32SerialPort のドキュメント文字列は非常に明確です。
win32eventreactor を使用する必要があるのは、addReader、addWriter メソッドが Windows 用に作成されているためだと思います。
QtReactor が使用されている場合、トランスポートで LooseConnection が呼び出されるとすぐに、これは twisted.internet.abstract で loseConnection を呼び出し、最終的に qt4reactor addWriter メソッドを呼び出します (出力をフラッシュするため)。
これにより、select() のファイル記述子番号を取得しようとする qt4reactor.TwistedSocketNotifier が作成されます。abstract.fileno メソッドは _win32SerialPort によって上書きされないため、常に -1 が返され、
ツイストで許可されていない複数のリアクターに関する多くの投稿を見てきましたが、Qt アプリケーションには QtReactor が必要であり、Windows シリアル ポートには win32eventreactor が必要であると仮定するのは正しいと思います。
または、使用できる他の回避策はありますか?
注 1: Windows で QtReactor を使用する場合、シリアル ポートは正常に動作します。つまり、データを送受信できます。「無効なソケットが指定されました」というメッセージが表示されるのは、アプリケーションを閉じたときだけです
注2:回避策を見つけました。私は QtReactor を使用していますが、アプリケーションを閉じるときに使用します
serial は _win32serialport.SerialPort のインスタンスです
この方法では、abstract.loseConnection が呼び出されることはありません。つまり、出力をフラッシュするために QtReactor addWriter が呼び出されることはありません。最善の解決策は、loseConnection を呼び出して出力を適切にフラッシュすることだと思います。
protocols - Protocol サブクラス内で twisted.internet.reactor を使用する
私はツイストを初めて使用し、非同期プログラミング全般、特にツイストの設計パターンを理解しようとしています。設計の観点から、次のように Protocol サブクラスからリアクターにアクセスすることをお勧めします。
twisted - ねじれた原子炉を条件付きで停止する
特定の条件に達したときにねじれたリアクターを停止する方法はありますか? たとえば、変数が特定の値に設定されている場合、リアクターは停止する必要がありますか?
python - ツイスト未処理エラー
ツイストリアクターが実行中で、キャッチされない遅延内で例外が発生すると、「未処理エラー」がトレースバックと例外とともに端末に出力されます。これらの例外を処理/インターセプトすることは可能ですか(たとえば、コールバックを設定するか、メソッドをオーバーライドします)?
編集:deferrerdにerrbackを追加することで、失敗をキャッチできることを認識しています。私が知りたいのは、チェーンを上って原子炉に到達した未処理の障害/例外をインターセプトする方法があるかどうかです。
編集:基本的に、ツイストリアクターにグローバルエラーハンドラーまたはアクセス可能なものがあるかどうか疑問に思っています。失敗からのトレースバックとエラーを出力するので疑問に思います。
例: