对于此代码:
import sys
import gevent
from gevent import monkey
monkey.patch_all()
import requests
import urllib2
def worker(url, use_urllib2=False):
if use_urllib2:
content = urllib2.urlopen(url).read().lower()
else:
content = requests.get(url, prefetch=True).content.lower()
title = content.split('<title>')[1].split('</title>')[0].strip()
urls = ['http://www.mail.ru']*5
def by_requests():
jobs = [gevent.spawn(worker, url) for url in urls]
gevent.joinall(jobs)
def by_urllib2():
jobs = [gevent.spawn(worker, url, True) for url in urls]
gevent.joinall(jobs)
if __name__=='__main__':
from timeit import Timer
t = Timer(stmt="by_requests()", setup="from __main__ import by_requests")
print 'by requests: %s seconds'%t.timeit(number=3)
t = Timer(stmt="by_urllib2()", setup="from __main__ import by_urllib2")
print 'by urllib2: %s seconds'%t.timeit(number=3)
sys.exit(0)
这个结果:
by requests: 18.3397213892 seconds
by urllib2: 2.48605842363 seconds
在嗅探器中它看起来是这样的:
描述:前 5 个请求由 requests 库发送,接下来的 5 个请求由 urllib2 库发送。 红色 - 工作被卡住的时间,黑暗 - 接收数据时...... wtf?!
如果套接字库已修补并且库必须以相同的方式工作,怎么可能? 如何在没有 requests.async 的情况下使用 requests 进行异步工作?
最佳答案
对不起,肯尼斯·赖茨。他的图书馆很棒。
我很傻。我需要像这样为 httplib 选择猴子补丁:
gevent.monkey.patch_all(httplib=True)
因为 httplib 的补丁默认是禁用的。
关于python - 如何启用请求异步模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9501663/