在Python中发起大量HTTP请求

3 投票
4 回答
1646 浏览
提问于 2025-04-16 11:31

我正在测试一个网页应用程序,这个过程需要发送大约1万次请求,然后从中挑选出少于1000个返回200 OK的请求,接着查看它们的数据。这个网页应用有很多bug,有些请求虽然返回了200,但其实是错误的,所以每个200 OK的结果都需要至少检查三遍。

我在用Python进行这个测试,尝试使用线程和urllib来实现,但在Linux系统上,当线程数量达到大约920个时,就会出现线程错误。我猜测可能是因为/proc/sys/kernel/threads-max这个值除以30后得出的结果,恰好和我遇到的问题一致,但这让我觉得很奇怪,因为每个线程在操作系统中似乎都被当作30个线程来处理。不管怎样,我在寻找一个好的解决方案来完成这个任务。我也考虑过使用Twisted,但看起来我还是会受到线程数量的限制。

有没有什么好的建议呢?

4 个回答

0

我之前用过Python的libcurl库(pycurl)来做这个。它有一个多客户端的功能,可以异步处理,也就是同时进行,不会等一个完成再开始下一个。这样速度挺快的。

0

你可以试试使用异步HTTP请求(文章底部有示例代码)。

1

我在测试apache ab这个网页服务器和TORNADO时,发现我的双核Athlon 2GHz的电脑每秒连接数很难超过1000个。测试工具ab占用了30%的资源,剩下的资源都给了服务器。我觉得大部分资源都是被操作系统和网络层消耗掉的。

http://amix.dk/blog/post/19581
非阻塞服务器的性能比阻塞服务器要好,因为它们不会为每个连接都创建一个线程。理论上,它们可以在一个线程中运行。

撰写回答