私は Twisted フレームワークを使用しており、非同期で RPC を取得しています。2秒ごとにタスクを実行し、その間にスリープする別の機能があります。これは、reactor.callInThread を通じて呼び出されます。これらは共有リソースに依存しているため、スレッドセーフなアクセス方法が必要です。ツイストでクリティカルセクション/ミューテックス/ロックを使用するにはどうすればよいですか?
2 に答える
ねじれでスレッドを使用できますが、ねじれでの通常のイディオムは、単一のスレッドを使用して非同期で RPC を実行することです。それはその利点の1つです。ねじれたフレームワークは、リアクターを実行し、RPC 結果の準備が整ったときにハンドラー イベントを呼び出します。その後、コードが実行され、ハンドラーが終了すると、制御がリアクターに戻り、コードの準備ができている次のハンドラーが呼び出されます。したがって、多くのことが並行して行われているにもかかわらず、twisted は一度に 1 つの関数のみが実行されるようにするため、ミューテックスを必要とせず、コールバックが現在のコンテキストを認識できるように状態変数を維持するだけで済みます。での運用で十分です。
明示的にスレッドを作成し、それらをツイスト フレームワークの実行中に使用する場合は、おそらくStandard Python Mutexのようなものが必要になるでしょう。リアクター内のコールバックはブロックされないはずなので、時間の。
Twistedを使用すると、単一のスレッドでイベント駆動型コードを記述できます。複数のイベントが安全な問題で標準のPythonの非スレッドセーフデータ構造に書き込むことができ、非スレッドセーフデータ構造をミューテックスとして使用できます。スレッドを使い始める場合は、これらのことを心配する必要があります。ただし、それらを使用する必要はありません。
したがって、コメントされているように、タスクにはtask.LoopingCallまたはreactor.CallLaterを使用します。time.sleep()を呼び出さないでください。適切なタイミングでreactorにタスクを呼び出させてください(そしてその間に他の作業を行ってください)。RPCが来たら応答します。
コードを同時に実行するスレッドは2つありません。ただし、コールバックが呼び出される順序はわかりません。制御をDeferredに放棄すると、アプリケーションの状態は、元に戻すまでに変更されている可能性があります。