最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python并發(fā)請求下限制QPS(每秒查詢率)的實(shí)現(xiàn)代碼

 更新時(shí)間:2020年06月05日 10:38:42   作者:Jiuh-star  
這篇文章主要介紹了Python并發(fā)請求下限制QPS(每秒查詢率)實(shí)現(xiàn)方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

  前兩天有一個需求,需要訪問某API服務(wù)器請求數(shù)據(jù),該服務(wù)器限制了QPS=2(哈哈應(yīng)該都知道是哪個服務(wù)器了吧_(:з」∠)_),因?yàn)镼PS很小所以就使用阻塞式請求。后來開通了服務(wù),QPS提高到了20,阻塞式請求滿足不了這個QPS了,于是使用了GRequests來并發(fā)請求數(shù)據(jù),但這里又遇到了一個問題:并發(fā)太快,服務(wù)器通過發(fā)送錯誤碼拒絕了很多數(shù)據(jù)的響應(yīng),造成了資源的浪費(fèi)。
  故在此記錄以下幾種 節(jié)流(Throttle) 方法:

  以下均假設(shè)有如下包和數(shù)據(jù)前提:

import grequests

urls = [
 "https://www.baidu.com",
 "https://www.google.com"
]
requests = [
 grequests.get(url)
 for url in urls
] * 1000

rate = 20 # 表示 20 請求/秒

time.sleep(1)

  這是最簡單的方法,通過time.sleep(1)阻塞進(jìn)程來控制每秒并發(fā)數(shù)量。用公式表達(dá)如下:Time=準(zhǔn)時(shí)+發(fā)時(shí)+time.sleep(1)Time = 請求準(zhǔn)備時(shí)延 + 請求發(fā)送時(shí)延 + time.sleep(1)Time=請求準(zhǔn)備時(shí)延+請求發(fā)送時(shí)延+time.sleep(1)   但是這種方法有一個較小的問題:不精確 。數(shù)據(jù)量越大,方差越大。

from time import sleep

req_groups = [
 requests[i: i+rate]
 for i in range(0, len(requests), rate)
]

ret = []
for req_group in req_groups:
 ret += grequests.map(req_group)
 sleep(1)

print(ret)

令牌桶(token bucket)方法

  這種方法較精確,可以確保誤差不超過±1(當(dāng)然前提是你的電腦和目標(biāo)服務(wù)器都能承受的了高并發(fā))。以下是耗時(shí)的公式表示:Time=準(zhǔn)時(shí)+發(fā)時(shí)+時(shí)延Time = 請求準(zhǔn)備時(shí)延 + 請求發(fā)送時(shí)延 + 令牌桶阻塞時(shí)延Time=請求準(zhǔn)備時(shí)延+請求發(fā)送時(shí)延+令牌桶阻塞時(shí)延 時(shí)1準(zhǔn)時(shí)+發(fā)時(shí)延令牌桶阻塞時(shí)延 ≈ 1 - 請求準(zhǔn)備時(shí)延 + 請求發(fā)送時(shí)延令牌桶阻塞時(shí)延≈1−請求準(zhǔn)備時(shí)延+請求發(fā)送時(shí)延   這種方法當(dāng)然也有一點(diǎn)缺陷,CPU看起來會很高(這是由于 while pass),盡管CPU真實(shí)使用率很低。

from time import time

class Throttle:
 def __init__(self, rate):
  self.rate = rate
  self.tokens = 0
  self.last = 0
 
 def consume(self, amount=1):
  now = time()
  
  if self.last == 0:
   self.last = now
  
  elapsed = now - self.last

  if int(elapsed * self.rate):
   self.tokens += int(elapsed * self.rate)
   self.last = now
  
  self.tokens = (
   self.rate
   if self.tokens > self.rate
   else self.tokens
  )
  
  if self.tokens >= amount:
   self.tokens -= amount
  else:
   amount = 0
  
  return amount

throttle = Throttle(rate)

req_groups = [
 requests[i: i+rate]
 for i in range(0, len(requests), rate)
]

ret = []
for req_group in req_groups:
 ret += grequests.map(req_group)
 while throttle.consume():
  pass # 阻塞

print(ret)

GRequests-Throttle

  這是一個使用令牌桶(token bucket)方法進(jìn)行封裝的GRequests修改版,使用方法很簡單:
  首先安裝grequests-throttle(清華鏡像源更新較慢,推薦使用阿里鏡像源)

pip install grequests-throttle
import grequests_throttle as gt

ret = gt.map(requests, rate=rate)
print(ret)

總結(jié)

  如果并發(fā)請求數(shù)量較小,可以考慮使用time.sleep(1)簡單快捷;當(dāng)并發(fā)請求數(shù)量較大時(shí),使用令牌桶(token bucket)方法能最大化利用每一秒;如果不想寫太多代碼,可以使用GRequests-Throttle包進(jìn)行請求流量控制。

到此這篇關(guān)于Python并發(fā)請求下限制QPS(每秒查詢率)實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python并發(fā)請求下限制QPS(每秒查詢率)實(shí)現(xiàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python+selenium 點(diǎn)擊單選框-radio的實(shí)現(xiàn)方法

    python+selenium 點(diǎn)擊單選框-radio的實(shí)現(xiàn)方法

    今天小編就為大家分享一篇python+selenium 點(diǎn)擊單選框-radio的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • Python?ttkbootstrap?制作賬戶注冊信息界面的案例代碼

    Python?ttkbootstrap?制作賬戶注冊信息界面的案例代碼

    ttkbootstrap 是一個基于 tkinter 的界面美化庫,使用這個工具可以開發(fā)出類似前端 bootstrap 風(fēng)格的 tkinter 桌面程序。本文重點(diǎn)給大家介紹Python?ttkbootstrap?制作賬戶注冊信息界面的案例代碼,感興趣的朋友一起看看吧
    2022-02-02
  • python使用marshal模塊序列化實(shí)例

    python使用marshal模塊序列化實(shí)例

    這篇文章主要介紹了python使用marshal模塊序列化的方法,是非常實(shí)用的技巧,需要的朋友可以參考下
    2014-09-09
  • python實(shí)現(xiàn)梯度下降和邏輯回歸

    python實(shí)現(xiàn)梯度下降和邏輯回歸

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)梯度下降和邏輯回歸,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 還不知道Anaconda是什么?讀這一篇文章就夠了

    還不知道Anaconda是什么?讀這一篇文章就夠了

    Anaconda指的是一個開源的Python發(fā)行版本,其包含了Conda、Python等180多個科學(xué)包及其依賴項(xiàng),下面這篇文章主要給大家介紹了關(guān)于Anaconda是什么的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • Python寫一個基于MD5的文件監(jiān)聽程序

    Python寫一個基于MD5的文件監(jiān)聽程序

    這篇文章主要給大家介紹了關(guān)于利用Python如何寫一個基于MD5的文件監(jiān)聽程序的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 談?wù)勅绾问謩俞尫臥ython的內(nèi)存

    談?wù)勅绾问謩俞尫臥ython的內(nèi)存

    Python不會自動清理這些內(nèi)存,這篇文章主要介紹了談?wù)勅绾问謩俞尫臥ython的內(nèi)存,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2016-12-12
  • python Tkinter的簡單入門教程

    python Tkinter的簡單入門教程

    這篇文章主要介紹了python Tkinter的簡單入門教程,幫助大家更好的理解和學(xué)習(xí)使用python制作gui程序,感興趣的朋友可以了解下
    2021-04-04
  • python excel和yaml文件的讀取封裝

    python excel和yaml文件的讀取封裝

    這篇文章主要介紹了python excel和yaml文件的讀取封裝,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2021-01-01
  • Python周期任務(wù)神器之Schedule模塊使用詳解

    Python周期任務(wù)神器之Schedule模塊使用詳解

    這篇文章主要為大家詳細(xì)介紹了Python中的周期任務(wù)神器—Schedule模塊的安裝和初級、進(jìn)階使用方法,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-04-04

最新評論

白水县| 天祝| 景泰县| 朝阳市| 关岭| 嘉禾县| 杭锦后旗| 江川县| 绥滨县| 新蔡县| 疏勒县| 普兰店市| 赞皇县| 蒙阴县| 鹤山市| 随州市| 锦屏县| 桓仁| 洪泽县| 泉州市| 兴宁市| 砀山县| 苍山县| 黎川县| 搜索| 海林市| 乌兰察布市| 乌什县| 盘山县| 丰镇市| 嫩江县| 缙云县| 资溪县| 昌邑市| 上虞市| 秦皇岛市| 文成县| 突泉县| 定陶县| 霍州市| 宜昌市|