使用Python的Treq on Twisted来进行HTTP压力测试

从事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 ',                 '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()

登录后复制

输出结果:

 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”类的数字代表被Twisted反应器准备好但是还没有发送的请求。这个脚本为了简洁性忽略了所有错误处理。为它添加超时状态的信息就留给读者作为一个练习。

这个脚本可以当做是一个起始点,你可以通过拓展改进它来自定义特定应用下的处理逻辑。建议你在改进的时候用collections.Counter 来替代丑陋的全局变量。这个脚本运行在单线程上,想通过一台机器压榨出最大量的请求的话,你可以用类似 mulitprocessing 的技术手段。

愿你乐在压力测试!

立即学习“Python免费学习笔记(深入)”;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2294962.html

(0)
上一篇 2025年2月28日 02:49:40
下一篇 2025年2月28日 02:50:06

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Python代码调试的几种方法总结

    使用 pdb 进行调试 pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点、单步调试、进入函数调试、查看当前代码、查看栈片段、动态改变变量的值等。pdb 提供了一些常用的调试命…

    2025年2月28日 编程技术
    200
  • 详解Python中with语句的用法

    引言 with 语句是从 Python 2.5 开始引入的一种与异常处理相关的功能(2.5 版本中要通过 from __future__ import with_statement 导入后才可以使用),从 2.6 版本开始缺省可用(参考 W…

    编程技术 2025年2月28日
    200
  • 使用Python编写类UNIX系统的命令行工具的教程

    引言 您是否能编写命令行工具?也许您可以,但您能编写出真正好用的命令行工具吗?本文讨论使用 Python 来创建一个强健的命令行工具,并带有内置的帮助菜单、错误处理和选项处理。由于一些奇怪的原因,很多人并不了解 Python? 的标准库具有…

    编程技术 2025年2月28日
    200
  • python获取本机外网ip的方法

    本文实例讲述了python获取本机外网ip的方法。分享给大家供大家参考。具体如下: python从显示ip地址的网站获取本机外网ip,这段python代码抓取网站上的ip地址信息 import urllibimport reprint “w…

    编程技术 2025年2月28日
    200
  • Python中的元类编程入门指引

    回顾面向对象编程 让我们先用 30 秒钟来回顾一下 OOP 到底是什么。在面向对象编程语言中,可以定义 类,它们的用途是将相关的数据和行为捆绑在一起。这些类可以继承其 父类的部分或全部性质,但也可以定义自己的属性(数据)或方法(行为)。在定…

    编程技术 2025年2月28日
    200
  • python中常用检测字符串相关函数汇总

    本文实例汇总了python中常用检测字符串相关函数。分享给大家供大家参考。具体分析如下: 下面的python代码可用于检测字符串,包括是否全部为数字,是否包含数字,是否包含标题单词,是否包含大写字母,是否包含小写字母,是否包含空格,是否以指…

    编程技术 2025年2月28日
    200
  • 使用Python下的XSLT API进行web开发的简单教程

    kafka 样式的 soap 端点 Christopher Dix 所开发的“Kafka — XSL SOAP 工具箱”(请参阅 参考资料)是一种用于构造 SOAP 端点的 XSLT 框架。它只涵盖了 SOAP 1.1,但 Kafka 端点…

    2025年2月28日
    200
  • 使用Python中的线程进行网络编程的入门教程

    引言 对于 Python 来说,并不缺少并发选项,其标准库中包括了对线程、进程和异步 I/O 的支持。在许多情况下,通过创建诸如异步、线程和子进程之类的高层模块,Python 简化了各种并发方法的使用。除了标准库之外,还有一些第三方的解决方…

    编程技术 2025年2月28日
    200
  • Python的Django框架使用入门指引

     前言 传统 Web 开发方式常常需要编写繁琐乏味的重复性代码,不仅页面表现与逻辑实现的代码混杂在一起,而且代码编写效率不高。对于开发者来说,选择一个功能强大并且操作简洁的开发框架来辅助完成繁杂的编码工作,将会对开发效率的提升起到很大帮助。…

    2025年2月28日 编程技术
    200
  • 讲解Python中for循环下的索引变量的作用域

    我们从一个测试开始。下面这个函数的功能是什么?  def foo(lst): a = 0 for i in lst: a += i b = 1 for t in lst: b *= i return a, b 登录后复制 如果你觉得它的功能…

    编程技术 2025年2月28日
    200

发表回复

登录后才能评论