Twisted のドキュメンテーションは、リアクターがカバーの下でこれをエレガントに処理するという同じアプリケーションで と のreactor.spawnProcess()
ようなテクニックを組み合わせても問題ないと私に信じさせました。threads.deferToThread()
実際に試してみると、アプリケーションがデッドロックすることがわかりました。複数のスレッドを単独で使用するか、子プロセスを単独で使用すると、すべて問題ありません。
リアクターのソースを調べると、実行中の可能性のある複数のスレッドを考慮せずにSelectReactor.spawnProcess()
メソッドが単純に呼び出されていることがわかりました。あなたへの呼び出しから始まると、複数の同時スレッドが実行され、同じファイル記述子で何を知っているかを知っている2つのプロセスがos.fork()
あるため、これはデッドロックを説明しています。os.fork()
SO に対する私の質問は、この問題を解決するための最善の戦略は何ですか?
私が念頭に置いているのは、 をサブクラスSelectReactor
化することです。これにより、シングルトンになりos.fork()
、インスタンス化されたときにすぐに 1 回だけ呼び出されます。子プロセスはバックグラウンドで実行され、親のサーバーとして機能します (パイプを介したオブジェクトのシリアル化を使用してやり取りします)。親は引き続きアプリケーションを実行し、必要に応じてスレッドを使用できます。親での呼び出しspawnProcess()
は子プロセスに委譲されます。子プロセスは 1 つのスレッドのみを実行することが保証されるため、os.fork()
安全に呼び出すことができます。
誰もこれを以前にやったことがありますか?もっと速い方法はありますか?