Python中线程的定期回调

时间:2013-06-27 13:15:30

标签: python

我的程序在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()

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

3 个答案:

答案 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