python使用第三方庫gevent模擬高併發請求

2021-10-23 05:55:40 字數 2223 閱讀 4339

因為工作中有個測試場景需要在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庫支援...