国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

使用Python的Treq on Twisted來進行HTTP壓力測試

2020-02-23 00:45:22
字體:
來源:轉載
供稿:網友

從事API相關的工作很有挑戰性,在高峰期保持系統的穩定及健壯性就是其中之一,這也是我們在Mailgun做很多壓力測試的原因。

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

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

Treq并不僅僅限于壓力測試:它是寫高并發HTTP客戶端的好工具,比如網頁抓取。Treq很優雅、易于使用且強大。這是一個例子:

 >>> 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進行轟炸。

 #!/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()            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宁河县| 阳朔县| 安阳市| 镇雄县| 泌阳县| 临颍县| 江川县| 远安县| 双桥区| 建水县| 辉南县| 临海市| 西乌珠穆沁旗| 台中市| 青河县| 邹平县| 中山市| 海城市| 嵩明县| 都江堰市| 宾阳县| 那曲县| 贵德县| 拜泉县| 徐闻县| 双牌县| 长武县| 房产| 潞城市| 额济纳旗| 蒙自县| 阳城县| 台中县| 海阳市| 宁化县| 仪陇县| 西宁市| 宕昌县| 西宁市| 临颍县| 南康市|