国产探花免费观看_亚洲丰满少妇自慰呻吟_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()            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 墨玉县| 馆陶县| 横山县| 香格里拉县| 滦南县| 库尔勒市| 额尔古纳市| 时尚| 安宁市| 文化| 昂仁县| 海城市| 天台县| 澄江县| 元朗区| 崇文区| 青海省| 延津县| 高碑店市| 乌拉特后旗| 永嘉县| 淳化县| 姜堰市| 九龙坡区| 周宁县| 鹤山市| 横山县| 湛江市| 石台县| 丹江口市| 姚安县| 大渡口区| 类乌齐县| 名山县| 南漳县| 房产| 盐池县| 繁峙县| 通化市| 夹江县| 炉霍县|