此代碼:如何啓用請求異步模式?
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個請求被請求庫sended,未來5個請求是由urllib2庫發送。 紅色 - 是工作凍結的時間,黑暗 - 當數據接收... wtf ?!
如果套接字庫補丁和庫必須工作相同,它將會怎樣? 如何在沒有requests.async的情況下使用請求進行異步工作?
你能一點點進一步解釋問題了嗎?爲什麼你不想使用requests.async模塊? – Phani 2012-03-01 06:12:28
請求不工作異步。爲什麼?我不希望使用requests.async,因爲它包含使用不良接口,也不會異步工作。看圖像,有工作請求和urllib2。 – user1239798 2012-03-01 12:16:54
請參閱http://stackoverflow.com/questions/9110593/asynchronous-requests-with-python-requests和https://github.com/kennethreitz/grequests。 – 2013-02-08 12:34:20