requests庫是python一個優秀的HTTP庫,使用它可以非常簡單地執行HTTP的各種操作,例如GET、POST等。不過,這個庫所執行的網絡請求都是同步了,即cpu發出請求指令后,IO執行發送和等待等操作,在這段IO執行的時間里,cpu什么也不做,這樣cpu的計算能力就被浪費了。所以,可以嘗試把網絡請求修改為異步的,也就是在IO發揮作用的這段時間,CPU去做這個程序里的其他事情,等IO收到響應的數據,CPU回來處理。偶然發現下面的帖子特分享與大家,並與requests庫進行簡單響應速度比較:
建議先閱讀原博主文章:
感謝原博主的分享精神,轉到原博地址: HTTPS://WWW.LETIANTIAN.ME/2014-10-04-ASYNCHRONOUS-REQUESTS/
重要參數:
這里需要補充的是幾個grequests的重要參數:
def grequests.map(requests, stream=False, size=None, exception_handler=None, gtimeout=None)
參數 | 說明 | 備注 |
---|---|---|
size | 協程的並發度 | 當一個協程進行IO等待的時候,就會將CPU交給其他協程序,一般設置為50 ~ 100足矣 |
exception_handler | 協程的並發度 | 捕獲單個請求的異常 |
gtimeout | 整體請求的超時設置 |
-----------------------------------華麗的分割線-----------------------------------------------------------------------
下面是對 grequests庫和requests庫的響應比較
pasting
# -*- coding: utf-8 -*-
import grequests
import time
import requests
import cProfile
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
# 同網絡環境下比較結果
def exception_handler(request, exception):
"""單個請求錯誤提示"""
print '請求錯誤'
urls = ['http://letiantian.me/'] * 10
def test1(urls):
# ------------------- grequests 庫請求-------------------------------------
reqs = [grequests.get(url) for url in urls] # 用時1秒左右
response = grequests.map(reqs, exception_handler=exception_handler)
# print response[9].status_code
return response
def test2(urls):
# ------------------- requests 庫請求-------------------------------------
reqs = [requests.get(url) for url in urls] # 用時7秒
return reqs
cProfile.run("test1(urls)")
cProfile.run("test2(urls)")
2/1 0.001 0.000 1.645 1.645 <string>:1(<module>) # test12/1 0.000 0.000 12.089 12.089 <string>:1(<module>) # test2