使用Python在异步HTTP请求中处理ConnectionError

时间:2017-06-24 00:24:52

标签: python python-requests gevent pool connectionexception

主要目标是让脚本运行(无论阻止 / ConnectionError 被引发时中断其他任务),即使在那里暂时没有互联网连接。

当我在我的脚本中实现错误处理以发送异步 HTTP 请求时,当出现 ConnectionError 异常时,我遇到了一种奇怪的行为:

好像没有互联网连接, greenlet 会阻止请求的并发,而且只会发出一个请求,从而失去了任务的同时性。

这是一个我希望一切都清楚的例子:

#Python 3.4 Windows 7 64 bit
import gevent.monkey
gevent.monkey.patch_all()
from gevent.pool import Pool
import requests
import time
import os

url = "http://pythonrequest.altervista.org/ten_seconds_delayed.php"
def task(args):
    try:
        r = requests.get(url)
    except requests.exceptions.ConnectionError as e:
        print("[ERROR]: ", e)

pool = Pool(10)
start_time = time.time()
for i in range(0,10):
    args = []
    args.append(i)
    args.append(url)
    pool.spawn(task, args)

print("Tasks sent to the pool, waiting for completing...")
pool.join()
end_time = time.time()
seconds_elapsed = end_time-start_time
print("Tasks completed")
print("seconds_elapsed: ",seconds_elapsed)
os.system("PAUSE")

我在两个条件下运行了两次脚本。

我第一次使用有效的互联网连接运行脚本 执行时间约为 10秒 第二次,我在没有互联网连接的情况下运行脚本(Windows-> Devices-> Net Device-> Disable)。
执行时间为 100秒


为什么100秒?不应该'单个请求超时10秒后是10秒? 执行时间似乎是timeout_of_request * number_of_request 我在第二种情况下表示,执行时间是 timeout_of_request 。 如果请求是同时的,他们应该花费10秒左右完成,否则意味着它们不是同时发生的? 我需要的是保持任务的同时性。有什么建议吗?

0 个答案:

没有答案