0

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

4

0 回答 0