class_docstr: Configurable asynchronous DNS resolver interface.
  
  By default, a blocking implementation is used (which simply calls
  `socket.getaddrinfo`).  An alternative implementation can be
  chosen with the `Resolver.configure <.Configurable.configure>`
  class method::
  
      Resolver.configure('tornado.netutil.ThreadedResolver')
  
  The implementations of this interface included with Tornado are
  
  * `tornado.netutil.DefaultLoopResolver`
  * `tornado.netutil.DefaultExecutorResolver` (deprecated)
  * `tornado.netutil.BlockingResolver` (deprecated)
  * `tornado.netutil.ThreadedResolver` (deprecated)
  * `tornado.netutil.OverrideResolver`
  * `tornado.platform.twisted.TwistedResolver` (deprecated)
  * `tornado.platform.caresresolver.CaresResolver` (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`.
class_docstr_tok: ["Configurable","asynchronous","DNS","resolver","interface",".","By","default",",","a","blocking","implementation","is","used","(","which","simply","calls","`","socket.getaddrinfo","`",")",".","An","alternative","implementation","can","be","chosen","with","the","`","Resolver.configure","<",".Configurable.configure",">","`","class","method",":",":","Resolver.configure","(","'tornado.netutil.ThreadedResolver","'",")","The","implementations","of","this","interface","included","with","Tornado","are","*","`","tornado.netutil.DefaultLoopResolver","`","*","`","tornado.netutil.DefaultExecutorResolver","`","(","deprecated",")","*","`","tornado.netutil.BlockingResolver","`","(","deprecated",")","*","`","tornado.netutil.ThreadedResolver","`","(","deprecated",")","*","`","tornado.netutil.OverrideResolver","`","*","`","tornado.platform.twisted.TwistedResolver","`","(","deprecated",")","*","`","tornado.platform.caresresolver.CaresResolver","`","(","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","`","."]
code: def configurable_default(cls) -> Type["Resolver"]:
      return DefaultLoopResolver
  
imports: import asyncio
  import concurrent.futures
  import errno
  import os
  import sys
  import socket
  import ssl
  import stat
  from tornado.concurrent import dummy_executor, run_on_executor
  from tornado.ioloop import IOLoop
  from tornado.util import Configurable, errno_from_exception
  from typing import List, Callable, Any, Type, Dict, Union, Tuple, Awaitable, Optional
label_desc: Use image node_id 2 for calling the Resolver obj's underlying member method code with example usage: obj.configurable_default(cls) and returns: DefaultLoopResolver