ポーリングしたい場合はtime.sleep
、ループ内で使用してください。
import time
...
while self.track:
time.sleep(1)
より正確さが必要な場合、たとえば、ループ内で他の操作を実行していて、自明ではない時間がかかる場合は、次のようにします。
...
while self.track:
start = time.time()
# Do things here
sleep_time = start-time.time() + 1
if sleep_time > 0:
time.sleep(sleep_time)
self.track
が に設定されるまでスレッドをブロックしようとしている場合は、別の角度からこれに到達することもできますTrue
。それが起こる前にすべてのワーカーが作成されます。
class A(object):
def __init__(self, player):
self._track = False
self.player = player
self._track_condition = threading.Condition()
@property
def track(self):
return self._track
@track.setter(self, value):
if value:
self._track_condition.acquire()
self._track_condition.notify_all()
self._track_condition.release()
self._track = value
def baz(self):
self._track_condition.acquire()
self._track_condition.wait()
self._track_condition.release()
while self.track:
# Do stuff
def spam(self):
player_thread = threading.Thread(target=self.baz)
player_thread.start()
ただし、プレーヤーのアクションが I/O バウンドでない限り、threading
おそらくパフォーマンスにあまり影響を与えず、パフォーマンスを損なう可能性さえあることに注意してください。 threading.Thread
はすべてGIL内に存在するため、実際には同時に並行して実行することはできません。あなたがそれを望むなら、あなたが必要multiprocessing
です。