異步請求Python庫 grequests的應用和與requests庫的響應速度的比較


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>) # test1

2/1 0.000 0.000 12.089 12.089 <string>:1(<module>)  # test2

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM