如何在 python 中创建间隔函数调用的后台线程



我正在尝试实现在后台工作的心跳调用。如何创建每 30 秒一次的间隔线程调用,该调用调用以下函数:

self.mqConn.heartbeat_tick()

另外我将如何停止此线程?

非常感谢。

使用包含循环的线程

from threading import Thread
import time
def background_task():
    while not background_task.cancelled:
        self.mqConn.heartbeat_tick()
        time.sleep(30)
background_task.cancelled = False
t = Thread(target=background_task)
t.start()
background_task.cancelled = True

或者,您可以子类计时器,以使取消变得容易:

from threading import Timer
class RepeatingTimer(Timer):
    def run(self):
        while not self.finished.is_set():
            self.function(*self.args, **self.kwargs)
            self.finished.wait(self.interval)

t = RepeatingTimer(30.0, self.mqConn.heartbeat_tick)
t.start() # every 30 seconds, call heartbeat_tick
# later
t.cancel() # cancels execution

或者,您可以在线程模块中使用 Timer 类:

from threading import Timer
def hello():
    print "hello, world"
t = Timer(30.0, hello)
t.start() # after 30 seconds, "hello, world" will be printed
t.cancel() # cancels execution, this only works before the 30 seconds is elapsed

这不会每 x 秒启动一次,而是在 x 秒内延迟线程执行。但是您仍然可以将其放在循环中并使用 t.is_alive() 查看其状态。

Eric 的回答的快速跟进:你不能在 python 2 中对Timer进行子类化,因为它实际上是围绕真实类的轻函数包装器:_Timer 。 如果你这样做,你会得到这篇文章中弹出的问题。

改用_Timer可以修复它:

from threading import _Timer
class RepeatingTimer(_Timer):
    def run(self):
        while not self.finished.is_set():
            self.function(*self.args, **self.kwargs)
            self.finished.wait(self.interval)

t = RepeatingTimer(30.0, self.mqConn.heartbeat_tick)
t.start() # every 30 seconds, call heartbeat_tick
# later
t.cancel() # cancels execution

一种方法是使用电路应用程序框架,如下所示:

from circuits import Component, Event, Timer

class App(Component):
    def init(self, mqConn):
        self.mqConn = mqConn
        Timer(30, Event.create("heartbeat"), persist=True).register(self)
    def heartbeat(self):
        self.mqConn.heartbeat_tick()

App().run()

注意:我是电路:)的作者

这只是一个基本的想法和结构 - 您需要对其进行调整以适应您的确切应用和要求!

相关内容

  • 没有找到相关文章

最新更新