我的程序在baz
方法的新主题中调用方法spam
。
现在我需要每隔一秒检查一次self.track的值。
import threading
class A(threading.Thread):
def __init__(self, player):
self.track = True
def Baz(self):
// how do i check the value of self.track every 1 second here
while self.track:
// do something
def Spam(self):
player_thread = Thread(target=self.Baz)
player_thread.start()
如何检查,每隔一秒说一次?
答案 0 :(得分:3)
你检查,然后在一个循环中睡一秒钟。
答案 1 :(得分:1)
使用time.sleep
:
from time import sleep
def Baz(self):
// Will check self.track each second until it becomes true
while not self.track:
sleep(1)
while self.track:
//do something
根据您要实现的目标,您可能想要了解一下select
api。这通常比使用定期探测更好。
答案 2 :(得分:1)
如果你想轮询,只需在循环中使用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
。