繁体   English   中英

在 n 分钟后在脚本中重新启动 python function

[英]Restart a python function in a script after n minutes

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

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()

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

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

您可以考虑使用如下所示的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)
        signal.alarm(TIMEOUT)
        listen()
    except TimeoutError:
        pass

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM