如果要轮询,只需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
s 都存在于GIL中,因此它们实际上不能同时并行执行。如果你想要,你需要multiprocessing
.