n 分钟后重新启动脚本中的 python 函数
Restart a python function in a script after n minutes
我有一个脚本使用服务器发送的事件库来连接定期向我推送事件的服务器。问题是流会在很长一段时间后冻结,我将不得不手动重新启动脚本,这是不可维护的。当前代码的结构如下所示
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()
但我不知道这是否有效,主要是因为后台线程将 运行 保留在后台,这意味着我将在一段时间后获得任务 运行 的副本。
我需要的是一种更好的方法来调用一个函数,并在经过一段时间后 return 从该函数调用并立即再次调用它。感谢您的帮助。
您可以考虑使用 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
我有一个脚本使用服务器发送的事件库来连接定期向我推送事件的服务器。问题是流会在很长一段时间后冻结,我将不得不手动重新启动脚本,这是不可维护的。当前代码的结构如下所示
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()
但我不知道这是否有效,主要是因为后台线程将 运行 保留在后台,这意味着我将在一段时间后获得任务 运行 的副本。
我需要的是一种更好的方法来调用一个函数,并在经过一段时间后 return 从该函数调用并立即再次调用它。感谢您的帮助。
您可以考虑使用 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