亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

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

系統(tǒng) 2006 0

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

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

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

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

            
 >>> 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

          

簡(jiǎn)單的測(cè)試腳本
如下是一個(gè)使用Treq的簡(jiǎn)單腳本,用最大可能量的請(qǐng)求來(lái)對(duì)單一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 
            
              ',
                 '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)備好但是還沒(méi)有發(fā)送的請(qǐng)求。這個(gè)腳本為了簡(jiǎn)潔性忽略了所有錯(cuò)誤處理。為它添加超時(shí)狀態(tài)的信息就留給讀者作為一個(gè)練習(xí)。

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

愿你樂(lè)在壓力測(cè)試!


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 久久精品国产精品国产精品污 | 欧美成人久久久 | 色成人综合 | 色综合久久中文 | 亚洲精品国产精品一区二区 | 精品国产综合 | 一 级 黄 中国色 片 | 精品国产一区二区三区不卡 | 亚洲欧美日韩国产精品久久 | 亚洲一区二区三区高清网 | 成年女人a毛片免费视频 | 国产亚洲精品一区二区在线观看 | 日日摸夜夜添夜夜添人人爽 | 狠狠丁香激情久久综合 | 国产日产久久 | 波多野结衣二区 | 欧美成人一级视频 | 亚洲一区不卡视频 | 四虎在线免费播放 | 99精品国产高清自在线看超 | 日本不卡在线观看 | 婷婷综合久久中文字幕一本 | 久久精品综合网 | 永久看日本大片免费 | 国产一区二区三区在线免费 | 亚洲欧美另类综合 | 国产成人精品视频一区二区不卡 | 久久这里一区二区精品 | 精品无人区乱码一区2区3区 | 99国产情在线视频 | 国产亚洲精品久久综合影院 | 日韩精品一区在线观看 | 亚洲精品视频在线看 | 涩涩伊人 | 国内精品久久久久影院亚洲 | 亚洲综合在线播放 | 热久久这里是精品6免费观看 | 国产精品美女一级在线观看 | 狠狠r| 天天天做天天天天爱天天想 | 国产大尺度视频 |