我疯了还是实际上这么快? (多线程)

时间:2016-08-28 02:14:49

标签: python multithreading tornado

from tornado import httpclient
import time

start = time.time()

for x in range(1000):
    httpclient.AsyncHTTPClient().fetch("https://www.google.com", method="GET")

print ('{0} seconds'.format(time.time() - start))

结果1.11500000954 seconds

我写这篇文章是为了看看我能以多快的速度向任何网站发送1000个请求(我选择谷歌)并且我不知道为什么,但我觉得我做错了什么并且实际上并没有这么快,如果我确实做错了什么,有人可以指出我的错误吗?

谢谢!

3 个答案:

答案 0 :(得分:6)

嗯,是的,你将1000个异步请求分拆给谷歌并计时。但是,您没有计算实际进行HTTP调用的开销。这需要callback-type处理程序。

答案 1 :(得分:0)

我还没有运行它,所以我可能是错的,但是fetch()是一个采用回调的异步方法,回调是处理来自服务器的响应。换句话说,我很确定你在这里~1秒内所做的一切就是创建请求的表示 - 你绝对不会等待回复,而且我不确定你是否一定要发送要求。我不知道这里的内部实现,但你可能会在某种意义上缓冲它们,或者你可能试图尽可能快地发送它们但是有些/很多都失败了 - 你真的不知道实际发生了什么,因为这些异步请求是“一劳永逸”。

如果您想知道可以发送多少USEFUL请求,例如那些将到达服务器并获得响应的请求,您需要在回调中执行计时,而不是在创建请求的线程中。

答案 2 :(得分:0)

正如其他答案已经指出的那样,access_token异步工作。您必须在IOLoop中运行请求。请注意,这与多线程无关。请求是并行执行的,但是在单个线程内(异步IO的核心功能)。

这是如何做到的:

tornado

您的代码只创建了1000个请求对象(确切地说Future个对象),实际上从未发送到服务器。

相关问题