如何使用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
方法中会发生一些特殊的事情?
答案 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
需要twisted
,CaresResolver
需要pycares
。我认为ThreadedResolver
在混合的IPv4 / IPv6环境中比其他两个更好。