<p>注意,<code>tornado.ioloop.PeriodicCallback</code><a href="http://www.tornadoweb.org/documentation/_modules/tornado/ioloop.html#PeriodicCallback" rel="nofollow noreferrer">takes a cycle time <strong>in integer ms</strong></a>,而<a href="http://www.tornadoweb.org/documentation/_modules/tornado/httpclient.html#HTTPRequest" rel="nofollow noreferrer">^{<cd2>}</a>对象配置了一个<code>connect_timeout</code>和/或一个<code>request_timeout</code>的float<strong>秒</strong>(<a href="http://www.tornadoweb.org/documentation/httpclient.html" rel="nofollow noreferrer">see doc</a>)。在</p>
<p>“<em>浏览互联网的用户觉得,当从单击到响应的延迟小于100毫秒时,响应是“即时的”(<a href="http://en.wikipedia.org/wiki/Network_performance#Relationship_between_latency_and_throughput" rel="nofollow noreferrer">from wikipedia</a>)请参见<a href="https://serverfault.com/questions/137348/how-much-network-latency-is-typical-for-east-west-coast-usa">this ServerFault question for <strong>normal latency</strong> values</a>。在</p>
<p><code>IOError: Stream is closed</code>被有效地引发以通知您连接超时而没有完成,或者更准确地说,您在尚未打开的管道上手动调用了回调。这很好,因为延迟大于100ms是正常的;如果您希望您的回迁能够可靠地完成,那么应该提高这个值。在</p>
<p>一旦将超时设置为合理的值,请考虑将获取打包到try/except retry循环中,因为这是一个正常的异常<em>,您可以预期在生产</em>中发生。小心设置重试限制!在</p>
<hr/>
<p>既然您使用的是异步框架,为什么不让它自己处理异步回调,而不是在固定的时间间隔内运行所述回调呢?<a href="http://www.tornadoweb.org/documentation/overview.html?highlight=epoll%20kqueue" rel="nofollow noreferrer">Epoll/kqueue are efficient and supported by this framework.</a></p>
<pre><code>import ioloop
def handle_request(response):
if response.error:
print "Error:", response.error
else:
print response.body
ioloop.IOLoop.instance().stop()
http_client = httpclient.AsyncHTTPClient()
http_client.fetch("http://www.google.com/", handle_request)
ioloop.IOLoop.instance().start()
</code></pre>
<p>^逐字复制<a href="http://www.tornadoweb.org/documentation/httpclient.html" rel="nofollow noreferrer">from the doc</a>。在</p>
<p>如果你走这条路,唯一的问题就是对你的请求队列进行编码,这样你就有了最大限度的开放连接。否则,当你做严重的刮擦时,你很可能会出现竞速状态。在</p>
<p>自从我自己接触龙卷风已经有大约1年了,所以请告诉我这个回答是否有不准确之处,我会修改的。在</p>