docs: def tornado_combiner(configs, use_gevent=False, start=True, monkey_patch=None,
                       Container=None, Server=None, threadpool=None):  # pragma: no cover
      """Combine servers in one tornado event loop process
  
      :param configs: [
          {
              'app': Microservice Application or another wsgi application, required
              'port': int, default: 5000
              'address': str, default: ""
          },
          { ... }
      ]
      :param use_gevent: if True, app.wsgi will be run in gevent.spawn
      :param start: if True, will be call utils.tornado_start()
      :param Container: your class, bases on tornado.wsgi.WSGIContainer, default: tornado.wsgi.WSGIContainer
      :param Server: your class, bases on tornado.httpserver.HTTPServer, default: tornado.httpserver.HTTPServer
      :param monkey_patch: boolean, use gevent.monkey.patch_all() for patching standard modules, default: use_gevent
      :return: list of tornado servers
      """
      servers = []
      if monkey_patch is None:
          monkey_patch = use_gevent
  
      if use_gevent:
          if monkey_patch:
              from gevent import monkey
              monkey.patch_all()
  
      if threadpool is not None:
          from multiprocessing.pool import ThreadPool
  
          if not isinstance(threadpool, ThreadPool):
              threadpool = ThreadPool(threadpool)
  
      for config in configs:
          app = config['app']
          port = config.get('port', 5000)
          address = config.get('address', '')
          server = tornado_run(app, use_gevent=use_gevent, port=port,
                               monkey_patch=False, address=address, start=False,
                               Container=Container,
                               Server=Server, threadpool=threadpool)
          servers.append(server)
      if start:
          tornado_start()
      return servers