因為工作中有個測試場景需要在1s內傳送100個請求,需要併發,本來想用多執行緒或協程實現的,但最後發現gevent這個第三方庫,真的很好用。
當然也可以使用concurrent.futures模組或者asyncio包實現高併發
gevent簡介:
gevent在python後台開發中是必不可少的工具庫,它的強大在於它能使同步的python**在io等待時間掛起,並執行其它任務,達到非同步的執行效果,從而提高程式的執行效率,達到高併發的功能。
ps: 期待我後面的文章講解如何在生產環境正確使用gevent大幅度提高伺服器效能吧:>)
廖雪峰的python教程是這樣說的:
gevent是第三方庫,通過greenlet實現協程,其基本思想是:
當乙個greenlet遇到io操作時,比如訪問網路,就自動切換到其他的greenlet,
等到io操作完成,再在適當的時候切換回來繼續執行。由於io操作非常耗時,
經常使程式處於等待狀態,有了gevent為我們自動切換協程,就保證總有greenlet在執行,
而不是等待io。
官方文件介紹如下:
gevent是乙個基於libev的併發庫。它為各種併發和網路相關的任務提供了整潔的api。
直接上**:
from gevent import monkey
import gevent
import requests
monkey.patch_socket(
)# 實現高併發,這個猴子補丁是必須的
n =100
# 併發數量
defworker
(i):
"""執行任務"""
resp = requests.get(url)
if resp.response_code ==
200:
print
(f'the time request end'
)def
run():
"""開始執行"""
workers =
[gevent.spawn(worker, i)
for i in
range
(n)]
# 傳引數i
gevent.joinall(workers)
# 等所有請求結束後退出,類似執行緒的join
print
('done!'
)if __name__ ==
"__main__"
: run(
)
但是上面的請求有個問題是,100次的併發請求是瞬間就發出去的,和我們的1s鐘剛好傳送100個請求不符合,這時,可以使用gevent.spawn_later() 實現定時傳送,就是上乙個請求和下乙個請求之間隔了1/100秒,這樣就正好1s傳送了100個請求
**如下:
from gevent import monkey
import gevent
import requests
monkey.patch_socket(
)# 實現高併發,這個猴子補丁是必須的
n =100
# 併發數量
defworker
(i):
"""執行任務"""
resp = requests.get(url)
if resp.response_code ==
200:
print
(f'the time request end'
)def
run():
"""開始執行"""
workers =
[gevent.spawn_later(i/n, worker, i)
for i in
range
(n)]
# 其實和上面的**就這裡不一樣
gevent.joinall(workers)
# 等所有請求結束後退出,類似執行緒的join
print
('done!'
)if __name__ ==
"__main__"
: run(
)
**解析: gevent.spawn_later函式中的 i/n 引數就是等待的秒數,如果是固定的值如10,則意思是10秒後才傳送高併發請求,但如果是i/n,則代表每個請求之間間隔1/n秒,所有請求發完就是一秒,如果你想在2s鍾發完請求,那就是2/n。 PyThon第三方庫
本文 自 戀花蝶的部落格 今天公司停電,沒上班。跑上來更新個部落格,跟大家分享一下我常用的幾個第三方 python 庫。python 語言之所以能夠如此流行,除了本身內建許多程式庫來保障快速開發之外,目不睱接的第三方庫也是一大主因。結合我目前的工作 網遊開發 我常用的幾個第三方庫如下 wxpytho...
python 第三方庫
requests 模組 具體詳見 requests 是用python語言編寫的第三方庫,基於 urllib,採用 apache2 licensed 開源協議的 http 庫。它比 urllib 更加方便,完全滿足 http 測試需求,多用於介面測試 常用介面 1.requests.request m...
python第三方庫
網路爬蟲是自動進行http訪問並獲取html頁面的程式。常用的python網路爬蟲庫 一 requests requests庫是乙個簡潔且簡單的處理http請求的第三方庫,它的最大優點是程式編寫過程更接近正常url訪問 過程。這個庫建立在python語言的urllib3庫基礎上。request庫支援...