1. 程式人生 > 程式設計 >Python使用grequests併發傳送請求的示例

Python使用grequests併發傳送請求的示例

前言

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]>]

以上就是Python使用grequests併發傳送請求的示例的詳細內容,更多關於Python grequests傳送請求的資料請關注我們其它相關文章!