如何确保Python中回调函数的及时性?

如何确保Python中回调函数的及时性?,python,Python,我有一个回调函数,但偶尔发出回调的委托需要几秒钟来提供更新(因为它正在通过远程连接等待数据)。对于我的用例来说,这很麻烦,因为我需要定期运行函数,或者退出程序。在python中有一个运行函数的计时器,或者如果在特定的时间间隔内(比如5秒钟)没有从委托获得更新,那么退出应用程序的最简单方法是什么 def parseMessage(client, userdata, message): # CALLBACK FUNCTION THAT LISTENS FOR NEW MESSAGES si

我有一个回调函数,但偶尔发出回调的委托需要几秒钟来提供更新(因为它正在通过远程连接等待数据)。对于我的用例来说,这很麻烦,因为我需要定期运行函数,或者退出程序。在python中有一个运行函数的计时器,或者如果在特定的时间间隔内(比如5秒钟)没有从委托获得更新,那么退出应用程序的最简单方法是什么


def parseMessage(client, userdata, message): # CALLBACK FUNCTION THAT LISTENS FOR NEW MESSAGES
    signal = int(str(message.payload.decode("utf-8")))
    writeToSerial(signal)

def exceptionState():  # THIS IS THE FUNCTION I WOULD LIKE TO RUN IF THERE'S NO CALLBACK
    print("ERROR, LINK IS DOWN, DISABLING SERVER")
    exit()

def mqttSignal():                
    client.on_message = parseMessage # THIS INVOKES THE CALLBACK FUNCTION
    client.loop_forever()


这听起来像是一个很好的场景,用于设置一个后台线程,如果您没有获得基于sentinel值的事件,该线程将退出。一个简单的实现可能如下所示:

from datetime import datetime, timedelta
from threading import Thread
from time import sleep

class Watcher:
  timeout = timedelta(minutes=5)

  def __init__(self):
    self.last_signal = datetime.now()
    Thread(target=self.exception_state).start()

  def parse_message(self):
    self.last_signal = datetime.now()
    # Other handling code here

  def exception_state(self):
    while True:
      if datetime.now() - self.last_signal > self.timeout:
        exit("No signal received.")
      sleep(5)
可能相关: