你的第一个问题就是你没有打电话
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
声明两个函数,因此它成为宇宙中每个人共享的全局变量。(可能很好,一个程序这么简单,但至少不是一个好习惯。)
但是,一旦我们摆脱了线程,我们也摆脱了函数,所以只有一个局部的
旗帜
所以问题不会首先出现。