起因
要用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...