0

我的程序从我的方法调用一个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()

我如何检查它,每隔一秒说一次?

4

3 回答 3

3

您检查,然后循环睡眠一秒钟。

于 2013-06-27T13:19:00.303 回答
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

根据您要实现的目标,您可能需要阅读一些有关selectapi 的信息。这通常比使用定期探测更好。

于 2013-06-27T13:19:51.047 回答
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.Threads 都存在于GIL中,因此它们实际上不能同时并行执行。如果你想要,你需要multiprocessing.

于 2013-06-27T13:22:04.930 回答