2

希望有人能够帮助解决这个问题。

简短版本:我正在寻找用 Python 构建自己的网站压力测试器。

为什么?因为我喜欢它 :) 我不是在寻找预先构建的解决方案 [即 funkload 或 JMeter]。作为编程练习,这似乎是一件有趣的事情。我还认为,学习如何做我想做的事在以后的其他情况下可能会很有用。

我要它做什么?随着时间的推移,我打算让它变得更复杂,但我的第一个目标很简单:在尽可能短的时间内发出尽可能多的请求。我正在拍摄每秒 300-500 个请求。

我尝试了许多不同的方法。最有前途的两个是:

  1. 产生线程。其中很多。让每个线程发出一个请求。这被证明是最快的[每个线程每秒可以轻松地接近 1 个请求 - 500 个线程意味着每秒几乎 500 个请求],但是它似乎对计算机来说非常密集。在我看来,在 Python 中生成数百个线程所占用的内存和计算量令人望而却步。我觉得必须有一个更优雅的解决方案。
  2. 使用 Python 的 asyncore 库。我一直在搞这个,它似乎真的很酷,但我很快就结束了。如果我收到大约 140 个字节的请求,那么它每秒能够抛出 >1000 个请求 [太棒了!],但我需要它能够处理响应相当大的请求 [即 100kb - 500kb]。引入更大的响应大小意味着它每秒限制大约 10-50 个请求 [如果我幸运的话]。

有没有人有任何想法或建议?如果我能以某种方式获得响应的大小而无需实际读取它,那将是完美的。我只想知道我实际上得到了正确的字节数。数据是什么并不重要。

或者,如果这不是 Python 中的一个选项,那么老实说,我愿意尝试任何人必须提出的任何建议。我玩过 Twister,但没有达到比我已经看到的线程更高的速度。

无论如何 - 任何帮助都会很棒。谢谢!

4

2 回答 2

4

我建议你试试gevent。它可以非常简单地完成这项任务,因为您编写的代码看起来是同步的,并且使用了 urllib2 之类的 python 标准库。它将非常快,因为它具有低内存开销(只为您使用的内容付费)并且它使用快速轮询系统调用 IO。此代码示例非常接近您想要的。您将希望每个核心运行一个 gevent 工作人员。

于 2011-07-27T22:13:17.527 回答
0

我建议你使用 pycurl,它是 libcurl 的 Python 绑定。它有自己的异步事件循环,速度非常快。

如果您不能按原样使用它,您还可以调整它的简化实现包装器。

请参阅 Pycopia 项目(我维护)的WWW.client模块。

于 2011-07-27T22:35:36.617 回答