用GREQUESTS實現併發HTTP請求

2021-10-09 03:18:12 字數 2007 閱讀 2071

起因

要用http請求探測服務的有效性,多程序,多執行緒,感覺似乎沒有必要,看看有沒有協程的方案

1. 簡單用法

grequests 利用 requests和gevent庫,做了乙個簡單封裝,使用起來非常方便

import grequests

import time

import requests

urls = [

'','',

'','',

'','',

'','',

]def method1():

t1 = time.time()

for url in urls:

res = requests.get(url)

#print res.status_code

t2 = time.time()

print 'method1', t2 - t1

def method2():

tasks = [grequests.get(u) for u in urls]

t1 = time.time()

res = grequests.map(tasks, size=3)

# print res

t2 = time.time()

print 'method2', t2 - t1

def method3():

tasks = [grequests.get(u) for u in urls]

t1 = time.time()

res = grequests.map(tasks, size=6)

# print res

t2 = time.time()

if __name__ == '__main__':

method1()

method2()

method3()

執行結果如下:

method1 8.51106119156

method2 5.77834510803

method3 2.55373907089

可以看到使用協程以後,整個程式的完成時間有了大大縮短,並且每個協程的併發粒度也會影響整體時間

2. 重要引數

這裡需要補充的是幾個

grequests

def grequests.map(requests, stream=false, size=none, exception_handler=none, gtimeout=none)
引數

說明備註

size

協程的併發度

當乙個協程進行io等待的時候,就會將cpu交給其他協程式,一般設定為50 ~ 100足矣

exception_handler

協程的併發度

捕獲單個請求的異常

gtimeout

整體請求的超時設定

另外,由於grequests底層使用的是requests,因此它支援

get,options, head, post, put, delete 等各種http method

所以以下的任務請求都是支援的

grequests.post(url, json=) 

grequests.delete(url)

3. 事件鉤子

grequests的底層庫,是requests,因此它也支援事件鉤子

def print_url(r, *args, **kwargs):

print(r.url)

url = ""

# 1.

res = requests.get(url, hooks=)

# 2.

tasks =

req = grequests.get(url, callback=print_url)

res = grequests.map(tasks)

Python使用grequests併發傳送請求

參考博文 requests是python傳送介面請求非常好用的乙個三方庫,由k神編寫,簡單,方便上手快。但是requests傳送請求是序列的,即阻塞的。傳送完一條請求才能傳送另一條請求。為了提公升測試效率,一般我們需要並行傳送請求。這裡可以使用多執行緒,或者協程,gevent或者aiohttp,然而...

grequests併發之小試牛刀

題主為某 鏈金融公司的測試人員,系統有額度開單 鏈單轉讓 鏈單融資功能,這些功能點在使用者序列請求情況下均不會出現金額溢位 如額度 所有使用該額度開出的鏈單金額總和 目前的測試需求是,測試使用者併發情況下,是否出現金額溢位。python的requests模組只能實現使用者序列請求,那麼有沒有滿足我的...

用gunicorn實現Django高併發的解決方案

django提供了自帶的runserver命令啟動服務,這種方式一般用於開發環境以便於除錯程式,併發量比較小的時候也是可以應對的,但是併發量超過這種方式的承載能力時,就需要使用gunicorn啟動django的服務來提高併發能力了。pip3 install django 2.0.6 gevent 1...