docs: def init_tornado_workers(self):
          """
          Prepare worker instances for all Tornado applications. Return
          :class:`list` of the :class:`ProcessWrapper` instances.
          """
          workers = []
  
          for tornado_app in get_tornado_apps(self.context, debug=False):
              interface = tornado_app.settings['interface']
  
              if not interface.port and not interface.unix_socket:
                  raise ValueError(
                      'Interface MUST listen either on TCP '
                      'or UNIX socket or both')
  
              name, processes, host, port, unix_socket = (
                  interface.name, interface.processes,
                  interface.host, interface.port, interface.unix_socket)
              if processes <= 0:
                  processes = tornado.process.cpu_count()
              sockets = []
              listen_on = []
  
              if port:
                  sockets.extend(tornado.netutil.bind_sockets(port, host))
                  listen_on.append("{:s}:{:d}".format(host, port))
              if unix_socket:
                  sockets.append(tornado.netutil.bind_unix_socket(unix_socket))
                  listen_on.append("{:s}".format(interface.unix_socket))
  
              self.logger.info(
                  "Init %d worker(s) for interface '%s' (%s)",
                  processes, name, ", ".join(listen_on))
  
              for dummy_i in six.moves.range(processes):
                  worker = ProcessWrapper(
                      TornadoProcess, (tornado_app, sockets),
                      wait_unless_ready=True, timeout=5.0,
                      name=name
                  )
                  workers.append(worker)
  
          return workers