In [2]:
import tornado.ioloop
has_ioloop = tornado.ioloop.IOLoop.initialized()
myport = 9500
server_list = {}
proxy_private = 9011

def get_port():
    myport = 9500
    while True:
        if not myport in server_list.keys():
            return myport
        myport = myport + 1

def register_port(prefix, port):
    import json
    import urllib.request
    data = {"target" : "http://localhost:%d" %  port }
    request = urllib.request.Request("http://localhost:%d/api/routes%s"
                                     % (proxy_private, prefix))
    request.add_header('Content-Type', 'application/json')
    response = urllib.request.urlopen(request,
                                      json.dumps(data).encode('utf-8'))

def register_start_app(prefix, app_list):
    import tornado.web
    import tornado.httpserver

    application = tornado.web.Application(app_list)
    http_server = tornado.httpserver.HTTPServer(application)
    port = get_port()
    http_server.listen(port)
    register_port(prefix, port)
    server_list[port] = http_server
    return port

def register_tornado_handler(prefix, handler):
    return register_start_app(prefix, [
        (prefix + "($|/.*$)", handler)
        ])

def register_wsgi(prefix, handler):
    import tornado.wsgi
    container = tornado.wsgi.WSGIContainer(handler)
    return register_start_app(prefix, [
        (prefix + "($|/.*$)",
         tornado.web.FallbackHandler, dict(fallback=container))
        ])

def unregister(port):
    server_list[port].stop()
    del server_list[port]

def unregister_all():
    for k, v in list(server_list.items()):
        v.stop()
        del server_list[k]

def start_loop():
    if not has_ioloop:
        tornado.ioloop.IOLoop.instance().start()

In [ ]: