Python使用grequests(gevent+requests)併發傳送請求過程解析
阿新 • • 發佈:2020-01-09
前言
requests是Python傳送介面請求非常好用的一個三方庫,由K神編寫,簡單,方便上手快。但是requests傳送請求是序列的,即阻塞的。傳送完一條請求才能傳送另一條請求。
為了提升測試效率,一般我們需要並行傳送請求。這裡可以使用多執行緒,或者協程,gevent或者aiohttp,然而使用起來,都相對麻煩。
grequests是K神基於gevent+requests編寫的一個併發傳送請求的庫,使用起來非常簡單。
安裝方法: pip install gevent grequests
專案地址:https://github.com/spyoungtech/grequests
grequests簡單使用
首先構造一個請求列表,使用grequests.map()並行傳送,得到一個響應列表。示例如下。
import grequests req_list = [ # 請求列表 grequests.get('http://httpbin.org/get?a=1&b=2'),grequests.post('http://httpbin.org/post',data={'a':1,'b':2}),grequests.put('http://httpbin.org/post',json={'a': 1,'b': 2}),] res_list = grequests.map(req_list) # 並行傳送,等最後一個執行完後返回 print(res_list[0].text) # 列印第一個請求的響應文字
grequests支援get、post、put、delete等requests支援的HTTP請求方法,使用引數和requests一致,傳送請求非常簡單。
通過遍歷res_list可以得到所有請求的返回結果。
grequests和requests效能對比
我們可以對比下requests序列和grequests並行請求100次github.com的時間,示例如下。
使用requests傳送請求
import requests import time start = time.time() res_list = [requests.get('https://github.com') for i in range(100)] print(time.time()-start)
實際耗時約100s+
使用grequests傳送
import grequests import time start = time.time() req_list = [grequests.get('https://github.com') for i in range(100)] res_list = grequests.map(req_list) print(time.time()-start)
實際耗時約3.58s
異常處理
在批量傳送請求時難免遇到某個請求url無法訪問或超時等異常,grequests.map()方法還支援自定義異常處理函式,示例如下。
import grequests def err_handler(request,exception): print("請求出錯") req_list = [ grequests.get('http://httpbin.org/delay/1',timeout=0.001),# 超時異常 grequests.get('http://fakedomain/'),# 該域名不存在 grequests.get('http://httpbin.org/status/500') # 正常返回500的請求 ] res_list = grequests.map(reqs,exception_handler=err_handler) print(res_list)
執行結果:
請求出錯 請求出錯 [None,None,<Response [500]>]
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。