class_docstr: Resolver implementation using a `concurrent.futures.Executor`.
  
  Use this instead of `ThreadedResolver` when you require additional
  control over the executor being used.
  
  The executor will be shut down when the resolver is closed unless
  ``close_resolver=False``; use this if you want to reuse the same
  executor elsewhere.
  
  .. versionchanged:: 4.1
     The ``io_loop`` argument is deprecated.
code: def resolve(self, host, port, family=socket.AF_UNSPEC):
      # 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.
      addrinfo = socket.getaddrinfo(
          host, port, family, socket.SOCK_STREAM
      )
      results = []
      for family, socktype, proto, canonname, address in addrinfo:
          results.append((family, address))
      return results
  
imports: from __future__ import absolute_import, division, print_function
  import errno
  import os
  import sys
  import socket
  import stat
  from tornado.concurrent import dummy_executor, run_on_executor
  from tornado.ioloop import IOLoop
  from tornado.platform.auto import set_close_exec
  from tornado.util import PY3, Configurable, errno_from_exception
label_desc: Use image node_id 3 for calling the ExecutorResolver obj's underlying member method code with example usage: obj.resolve(host, port, family) and returns: results