主要目标是让脚本运行(无论阻止 / 在 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秒左右完成,否则意味着它们不是同时发生的?
我需要的是保持任务的同时性。有什么建议吗?