【问题标题】:While loop with elsewhile 循环与 else
【发布时间】:2015-03-11 09:54:40
【问题描述】:

我正在使用一个 while 循环,我试图运行 5 分钟并检查它是否获得 http 响应代码 200。问题是如果它没有获得 200,它将继续运行,但它没有当站点应该启动并运行时,不要去其他地方。

r = requests.head("http://www.testing.co.uk")
while r.status_code != 200:
    print "Response not == to 200."
    time.sleep(30)
else:
    print "Response is 200 - OK"

【问题讨论】:

  • 那么问题出在哪里?
  • 除非您重复请求,否则status_code 不会改变!
  • 当它第一次没有达到 200 时,它会继续循环运行,如果站点在 50 秒后启动并运行。
  • 你应该尝试在while count < 5:这样的while循环中给出尝试次数而不是count -= ,而不是无限调用它。

标签: python python-2.7 while-loop python-requests


【解决方案1】:

重复请求。

r = requests.head("http://www.testing.co.uk")

while r.status_code != 200:
    print "Response not == to 200."
    time.sleep(30)
    r = requests.head("http://www.testing.co.uk")

else:
    print "Response is 200 - OK"

【讨论】:

  • 直到现在我才知道 while 循环可以包含 else 子句,但我并不真正理解它的用处。你不能只打印没有 else 的循环就已经被破坏了吗?
  • 没用while..else,代码重复(请求两次)
  • 我怎样才能给出最大尝试?如果它每 30 秒运行一次并且应该在 5 分钟后停止(尝试 10 次)
  • 只需使用计数器并将其添加到 for 循环的条件中。
  • @Iknowpython:您应该使用时间戳来确定何时超时。使用固定次数的尝试可能太不准确,例如。如果每个请求挂起 60 秒然后超时(并非所有请求都立即失败!)怎么办?其中 10 个,加上 30 秒的间隔实际上需要大约 15 分钟。
【解决方案2】:

试试这个,其中包括最多大约 5 分钟的超时检查:

import time
from datetime import datetime, timedelta
import requests

FIVE_MINUTES = timedelta(minutes=1) * 5
RETRY_DELAY = 30

end_time = datetime.now() + FIVE_MINUTES

while datetime.now() < end_time:
    r = requests.head("http://www.testing.co.uk")
    if r.status_code == 200:
        print "Response is 200 - OK"
        break
    else:
        print "Response not == to 200."
        time.sleep(RETRY_DELAY)
else:
    print 'Timed out'

N.B 大约是因为每个请求都会花费不可预测的时间,例如一个请求可能会挂起 2 分钟,而其他请求可能会立即失败。此外,您应该添加异常处理,因为requests 会针对“连接被拒绝”等失败引发异常。

【讨论】:

  • 是否可以循环“除了 requests.ConnectionError:”,因为如果服务器未启动,脚本将停止。
  • 是的。使用 try/except 语句并在其中执行您的头部请求。为您要捕获的每个异常添加一个异常处理程序。
【解决方案3】:

请求应该被循环:

numOfRequests = 1000
for i in range(numOfRequests):
    r = requests.head("http://www.testing.co.uk")
    if r.status_code == 200:
        print "Response is 200 - OK"
        break
    print "Response not == to 200."
    time.sleep(30)

【讨论】:

    猜你喜欢
    • 2012-06-03
    • 2014-01-21
    • 1970-01-01
    • 2023-03-22
    • 2015-11-08
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多