n分钟后重新启动脚本中的python函数



我有一个脚本,它使用服务器发送的事件库来连接定期向我推送事件的服务器。问题是流在很长一段时间后会冻结,我将不得不手动重新启动脚本,这是不可维护的。当前代码的结构看起来像这个

def listen(self):
print("listening to events .....")
try:
url = settings.EVENT_URL + "/v1/events"
auth_key = settings.KEY
headers = {
"Authorization": "Basic " + auth_key,
"Accept": "text/event-stream",
}
response = self.with_urllib3(url, headers)
client = sseclient.SSEClient(response)
for event in client.events():
# the script freezes here.
logger.info(event.data)
process(event.data)

我试过做一些类似的事情

def start(self):
def wait():
time.sleep(10 * 60)
background = threading.Thread(name = 'background', target = self.listen)
background.daemon = True
background.start()
wait()
try:
self.start()
except:
self.start()
finally:
self.start()

但我不知道这是否有效,主要是因为后台进程线程将继续在后台运行,这意味着我将在一段时间后运行任务的副本。

我需要的是一种更好的方法来调用一个函数,并在经过一段时间后从该函数返回并立即再次调用它。谢谢你的帮助。

您可以考虑使用signal模块进行构建,如下所示。不过需要注意的是,SIGALRM信号与Windows不兼容。

import signal

TIMEOUT = 5

def _handle_alarm(_, __):
raise TimeoutError("Some useful message")

def listen():
print("Starting to listen...")
import time
time.sleep(10)

while True:
try:
timer = signal.signal(signal.SIGALRM, _handle_alarm)
timer.alarm(TIMEOUT)
listen()
except TimeoutError:
pass

最新更新