添加超时以连接Tornado TCPClient

时间:2015-10-21 21:37:12

标签: python tornado

如何使用tornado.tcpclient.TCPClient.connect

添加连接到远程服务器的超时时间

我尝试了什么

In [1]: from tornado import gen

In [2]: from tornado.tcpclient import TCPClient

In [3]: from tornado.ioloop import IOLoop

In [4]: from datetime import timedelta
In [5]: client = TCPClient()
In [6]: IOLoop.current().run_sync(
           lambda: gen.with_timeout(timedelta(seconds=1), 
                                    client.connect('bad-host', 8382)))
gaierror: [Errno -2] Name or service not known

这需要超过一秒才能终止。也许我不正确地使用gen.with_timeout?也许在connect方法中会发生一些特殊的事情?

1 个答案:

答案 0 :(得分:2)

我的猜测是问题与阻止DNS解析有关。 Tornado中的默认Resolver是阻止,这意味着在解决过程中不会触发超时。尝试配置http://www.tornadoweb.org/en/stable/netutil.html#tornado.netutil.Resolver中列出的其中一个备用解析器:

tornado.netutil.Resolver.configure('tornado.netutil.ThreadedResolver')

这些不是默认值的原因是它们都需要非标准依赖项:ThreadedResolver需要futures包(在Python 2上),TwistedResolver需要twistedCaresResolver需要pycares。我认为ThreadedResolver在混合的IPv4 / IPv6环境中比其他两个更好。