欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用Python的Treq on Twisted來進(jìn)行HTTP壓力測試

 更新時間:2015年04月16日 11:14:30   投稿:goldensun  
這篇文章主要介紹了使用Python的Treq on Twisted來進(jìn)行HTTP壓力測試,基于Python中的Twisted框架,需要的朋友可以參考下

從事API相關(guān)的工作很有挑戰(zhàn)性,在高峰期保持系統(tǒng)的穩(wěn)定及健壯性就是其中之一,這也是我們在Mailgun做很多壓力測試的原因。

這么久以來,我們已經(jīng)嘗試了很多種方法,從簡單的ApacheBench到復(fù)雜些的自定義測試套。但是本貼講述的,是一種使用python進(jìn)行“快速粗糙”卻非常靈活的壓力測試的方法。
使用python寫HTTP客戶端的時候,我們都很喜歡用 Requests library。這也是我們向我們的API用戶們推薦的。Requests 很強(qiáng)大,但有一個缺點,它是一個模塊化的每線程一個調(diào)用的東西,很難或者說不可能用它來快速的產(chǎn)生成千上萬級別的請求。
Treq on Twisted簡介

為解決這個問題我們引入了Treq (Github庫)。Treq是一個HTTP客戶端庫,受Requests影響,但是它運行在Twisted上,具有Twisted典型的強(qiáng)大能力:處理網(wǎng)絡(luò)I/O時它是異步且高度并發(fā)的方式。

Treq并不僅僅限于壓力測試:它是寫高并發(fā)HTTP客戶端的好工具,比如網(wǎng)頁抓取。Treq很優(yōu)雅、易于使用且強(qiáng)大。這是一個例子:

 >>> from treq import get
  
 >>> def done(response):
 ...   print response.code
 ...   reactor.stop()
  
 >>> get("http://www.github.com").addCallback(done)
  
 >>> from twisted.internet import reactor
 200

簡單的測試腳本
如下是一個使用Treq的簡單腳本,用最大可能量的請求來對單一URL進(jìn)行轟炸。

 #!/usr/bin/env python
 from twisted.internet import epollreactor
 epollreactor.install()
  
 from twisted.internet import reactor, task
 from twisted.web.client import HTTPConnectionPool
 import treq
 import random
 from datetime import datetime
  
 req_generated = 0
 req_made = 0
 req_done = 0
  
 cooperator = task.Cooperator()
  
 pool = HTTPConnectionPool(reactor)
  
 def counter():
   '''This function gets called once a second and prints the progress at one
   second intervals.
   '''
   print("Requests: {} generated; {} made; {} done".format(
       req_generated, req_made, req_done))
   # reset the counters and reschedule ourselves
   req_generated = req_made = req_done = 0
   reactor.callLater(1, counter)
  
 def body_received(body):
   global req_done
   req_done += 1
  
 def request_done(response):
   global req_made
   deferred = treq.json_content(response)
   req_made += 1
   deferred.addCallback(body_received)
   deferred.addErrback(lambda x: None) # ignore errors
   return deferred
  
 def request():
   deferred = treq.post('http://api.host/v2/loadtest/messages',
              auth=('api', 'api-key'),
              data={'from': 'Loadtest <test@example.com>',
                 'to': 'to@example.org',
                'subject': "test"},
             pool=pool)
   deferred.addCallback(request_done)
   return deferred
  
 def requests_generator():
   global req_generated
   while True:
     deferred = request()
     req_generated += 1
     # do not yield deferred here so cooperator won't pause until
     # response is received
     yield None
  
 if __name__ == '__main__':
   # make cooperator work on spawning requests
   cooperator.cooperate(requests_generator())
  
   # run the counter that will be reporting sending speed once a second
   reactor.callLater(1, counter)
  
   # run the reactor
   reactor.run()

輸出結(jié)果:

 2013-04-25 09:30 Requests: 327 generated; 153 sent; 153 received
 2013-04-25 09:30 Requests: 306 generated; 156 sent; 156 received
 2013-04-25 09:30 Requests: 318 generated; 184 sent; 154 received

“Generated”類的數(shù)字代表被Twisted反應(yīng)器準(zhǔn)備好但是還沒有發(fā)送的請求。這個腳本為了簡潔性忽略了所有錯誤處理。為它添加超時狀態(tài)的信息就留給讀者作為一個練習(xí)。

這個腳本可以當(dāng)做是一個起始點,你可以通過拓展改進(jìn)它來自定義特定應(yīng)用下的處理邏輯。建議你在改進(jìn)的時候用collections.Counter 來替代丑陋的全局變量。這個腳本運行在單線程上,想通過一臺機(jī)器壓榨出最大量的請求的話,你可以用類似 mulitprocessing 的技術(shù)手段。

愿你樂在壓力測試!

相關(guān)文章

  • Python編譯成.so文件進(jìn)行加密后調(diào)用的實現(xiàn)

    Python編譯成.so文件進(jìn)行加密后調(diào)用的實現(xiàn)

    今天小編就為大家分享一篇Python編譯成.so文件進(jìn)行加密后調(diào)用的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • 探索Python fcntl模塊文件鎖和文件控制的強(qiáng)大工具使用實例

    探索Python fcntl模塊文件鎖和文件控制的強(qiáng)大工具使用實例

    這篇文章主要介紹了Python fcntl模塊文件鎖和文件控制的強(qiáng)大工具使用實例探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • python學(xué)習(xí)之基于Python的人臉識別技術(shù)學(xué)習(xí)

    python學(xué)習(xí)之基于Python的人臉識別技術(shù)學(xué)習(xí)

    面部識別技術(shù)的應(yīng)用越來越廣泛,它廣泛應(yīng)用于安全系統(tǒng)、人機(jī)交互、社交媒體、醫(yī)療保健等領(lǐng)域。本文介紹了基于Python的人臉識別技術(shù),感興趣的小伙伴可以參考閱讀
    2023-03-03
  • Python利用遞歸和walk()遍歷目錄文件的方法示例

    Python利用遞歸和walk()遍歷目錄文件的方法示例

    在日常開發(fā)中經(jīng)常需要檢查一個“目錄或文件夾”內(nèi)部有沒有我們想要的文件或者文件夾,下面這篇文章主要給大家介紹了關(guān)于Python利用遞歸和walk()遍歷目錄文件的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-07-07
  • Pandas.DataFrame重置Series的索引index(reset_index)

    Pandas.DataFrame重置Series的索引index(reset_index)

    本文主要介紹了Pandas.DataFrame重置Series的索引index(reset_index),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Python datetime模塊的使用示例

    Python datetime模塊的使用示例

    這篇文章主要介紹了Python datetime模塊的使用示例,幫助大家更好的理解和使用python處理時間,感興趣的朋友可以了解下
    2021-02-02
  • Python multiprocessing 進(jìn)程間通信方式實現(xiàn)

    Python multiprocessing 進(jìn)程間通信方式實現(xiàn)

    本文主要介紹了Python multiprocessing 進(jìn)程間通信方式實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Python模擬用戶登錄驗證

    Python模擬用戶登錄驗證

    這篇文章主要為大家詳細(xì)介紹了Python模擬用戶登錄驗證的相關(guān)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Python判斷三段線能否構(gòu)成三角形的代碼

    Python判斷三段線能否構(gòu)成三角形的代碼

    這篇文章主要介紹了Python判斷三段線能否構(gòu)成三角形的代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • PYQT5 實現(xiàn)給listwidget的滾動條添加滾動信號

    PYQT5 實現(xiàn)給listwidget的滾動條添加滾動信號

    這篇文章主要介紹了PYQT5 實現(xiàn)給listwidget的滾動條添加滾動信號,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03

最新評論