0

私は、非同期のI/Oコールバックから定期的に更新されるPythonオブジェクトを持っています。いくつかのスレッドは、このオブジェクトが更新されるのを待つ必要があります。Pythonの待ちスレッドを一度起動する

この「更新」イベントは瞬間的なイベントであり、待機中のスレッドに目を覚ませるように指示するアクションは、アトミックなものでなければなりません。

私はいくつかの解決策を探しています:

  • 条件オブジェクトがある、最初のロックを取得するためにあなたを必要とする無行く:私はwait妨害されずに到達するために複数のスレッドを必要とし、取得するために戦っなしロック。
  • イベントオブジェクトは競合状態を生成します。イベントがクリアされる前にスレッドがwaitに達すると、スレッドは待機せず、逆にイベントがクリアされてからスレッドが覚醒する可能性があります。

最善の解決策は、POSIX pause/killコンボの相当するだろうが、スレッドのための(少なくとも私は考えることができる最高)。

ので、質問:

  • pause/killコンボは、Python 2.7スレッドの同等の、そしてどちらを持っていますか?
  • もしそうでなければ、Python 2.7標準ライブラリを使用して、私のユースケースで最も信頼性の高い妥協点は何ですか?ここで

私が達成したいものと同様のものである:

# Would be a derived of threading.Event 
# and the perfect solution for me, if it existed 
ev = InstantEvent() 

def update(*args): 
    # do stuff with args 
    ev.notifyAll() 

if __name__ == "__main__": 
    # do startup stuff 
    ev.wait() 
    # do more stuff 

答えて

0

あなたが見るように、各イベントがwait()でEventオブジェクトを待つことができます。さらに、イベントを定期的にチェックし(タイムアウトで待機する)、ループ内で自分の仕事を行うことができます。コールバックは、完了したときにイベントを設定します。いくつかのイベントを組み合わせて組み合わせることができます。私はあなたの問題を理解できません。イベントの代わりにイベント使用のセマフォを排他的に反応させたい場合:1つのスレッド/リスナだけがコールバック完了を処理できるようにする。 Pythonスレッディングの詳細:https://docs.python.org/3/library/threading.html

関連する問題