提供的主要目标是让脚本运行(在引发ConnectionError时不会阻塞/中断其他任务),即使暂时没有 Internet 连接也是如此。
当我在我的脚本中实现错误处理以发送异步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 秒左右才能完成,否则这意味着它们不是同时的?
我需要的是保持任务的同时性。有什么建议吗?