from tornado import gen
from tornado.ioloop import IOLoop
-from tornado.netutil import Resolver, ThreadedResolver
+from tornado.netutil import Resolver, ThreadedResolver, DefaultExecutorResolver
from tornado.options import parse_command_line, define, options
try:
args = ['localhost', 'www.google.com',
'www.facebook.com', 'www.dropbox.com']
- resolvers = [Resolver(), ThreadedResolver()]
+ resolvers = [Resolver(), ThreadedResolver(), DefaultExecutorResolver()]
if twisted is not None:
from tornado.platform.twisted import TwistedResolver
"""Miscellaneous network utility code."""
+import asyncio
import concurrent.futures
import errno
import os
The implementations of this interface included with Tornado are
+ * `tornado.netutil.DefaultLoopResolver`
* `tornado.netutil.DefaultExecutorResolver`
* `tornado.netutil.BlockingResolver` (deprecated)
* `tornado.netutil.ThreadedResolver` (deprecated)
.. versionchanged:: 5.0
The default implementation has changed from `BlockingResolver` to
`DefaultExecutorResolver`.
+
+ .. versionchanged:: 6.2
+ The default implementation has changed from `DefaultExecutorResolver` to
+ `DefaultLoopResolver`.
"""
@classmethod
@classmethod
def configurable_default(cls) -> Type["Resolver"]:
- return DefaultExecutorResolver
+ return DefaultLoopResolver
def resolve(
self, host: str, port: int, family: socket.AddressFamily = socket.AF_UNSPEC
return result
+class DefaultLoopResolver(Resolver):
+ """Resolver implementation using `asyncio.loop.getaddrinfo`."""
+
+ async def resolve(
+ self, host: str, port: int, family: socket.AddressFamily = socket.AF_UNSPEC
+ ) -> List[Tuple[int, Any]]:
+ # On Solaris, getaddrinfo fails if the given port is not found
+ # in /etc/services and no socket type is given, so we must pass
+ # one here. The socket type used here doesn't seem to actually
+ # matter (we discard the one we get back in the results),
+ # so the addresses we return should still be usable with SOCK_DGRAM.
+ return [
+ (fam, address)
+ for fam, _, _, _, address in await asyncio.get_running_loop().getaddrinfo(
+ host, port, family=family, type=socket.SOCK_STREAM
+ )
+ ]
+
+
class ExecutorResolver(Resolver):
"""Resolver implementation using a `concurrent.futures.Executor`.
The ``io_loop`` argument (deprecated since version 4.1) has been removed.
.. deprecated:: 5.0
- The default `Resolver` now uses `.IOLoop.run_in_executor`; use that instead
- of this class.
+ The default `Resolver` now uses `asyncio.loop.getaddrinfo`;
+ use that instead of this class.
"""
def initialize(