代码之家  ›  专栏  ›  技术社区  ›  Kai

python在超时后执行函数

  •  0
  • Kai  · 技术社区  · 7 年前

    我想在while-true循环中的超时之后启动一个函数,但是代码不执行任何操作并跳出循环,我不知道为什么:/

    这是我的密码

    import requests
    from threading import Timer
    
    def timeout(flag):
                print("New Request")
                statuscode = requests.get("http://adslkfhdsjf.de").status_code
                if statuscode == 200 and flag == 0:
                    print("Service available")
                #Testzwecke
                print("Flag: ", flag)
                flag = 0
                #Poste result to Backend
            elif statuscode == 200 and flag == 1: 
                print("Service is available now")
                print("Flag: ", flag)
                flag = 0
                #Email an User
                #Post Request
            elif statuscode != 200 and flag == 0:
                print("Service is not available")
                #Testzwecke
                print("Flag: ", flag)
                flag = 1
                #Email to User
                #Post Request
            else: 
                print("Service is not available")
                #Testzwecke
                print("Flag: ", flag)
                #Post Request
            Timer(10, timeout, flag)
    
    timeout(0)
    

    我希望每10秒执行一次超时。因此,每隔10秒将执行函数timeout()中的一个条件。

    但是到目前为止它还没有工作,控制台输出什么也没有:/

    1 回复  |  直到 7 年前
        1
  •  3
  •   abarnert    7 年前

    你的第一个问题就是你没有打电话 main() . 通常情况下,我会添加一条评论来告诉你,然后以打字错误的形式结束这个问题,但是你不想在你第一次解决更大的问题之前解决它。

    您的代码尝试创建并调用新的 timeout 尽可能快地反复工作。第一件事是 超时 函数的作用是创建一个新的 Timer 对象。这是一条新的线。

    因此,您将以尽可能快的速度生成新线程,这意味着在很短的时间内,您将拥有比操作系统能够处理的更多的线程。如果你幸运的话,那就意味着你会得到一个例外,你的程序就会退出。如果你不走运,这意味着当内核开始将线程堆栈交换到磁盘上时,你的系统会变得缓慢,即使在你设法杀死程序之后,恢复也可能需要几分钟。

    实际上,没有理由 while 在这里循环。每个 定时器 安排下一个 计时器 所以它会一直运行下去。这样一次只有两个线程存活。

    但根本没有理由 定时器 首先。你不想在请求之间等待10秒钟,所以为什么不 sleep ?

    import time
    import requests
    
    def main():
        flag = 0
        while True:
            print("New Request")
            statuscode = requests.get("http://google.de").status_code
            if statuscode == 200 and flag == 0:
                print("Service available")
                # etc.
            time.sleep(10)
    
    main()
    

    您的代码还有另一个问题:您正在定义一个名为 flag 在里面 超时 但是你要用它 flag == 0 在你分配给它之前检查一下。这会提高 UnboundLocalError . 事实上,您也有一个名为 旗帜 在里面 main 没什么区别。要解决此问题,您必须执行以下操作之一:

    • 通过 旗帜 作为一个论点 定时器 传递给每个 超时 作为参数调用。(可能是最好的。)
    • 添加一个 nonlocal flag 声明收件人 超时 ,因此它成为所有 超时 您定义的函数。(不错,但不是最惯用的解决方案。)
    • 添加一个 global flag 声明两个函数,因此它成为宇宙中每个人共享的全局变量。(可能很好,一个程序这么简单,但至少不是一个好习惯。)

    但是,一旦我们摆脱了线程,我们也摆脱了函数,所以只有一个局部的 旗帜 所以问题不会首先出现。