Esempio n. 1
0
def main():
    parser = argparse.ArgumentParser(description='Development Server Help')
    parser.add_argument("-p", "--port", action="store", dest="port", type=int,
                        help="listening port", default=8000)
    parser.add_argument("-n", "--num_processes", action="store", dest="num_processes", type=int,
                        help="num of worker processes", default=8)
    parser.add_argument("-m", "--multi_port", action="store_true", dest="multi_port",
                        help="use different port for each process", default=False)
    parser.add_argument("-c", "--cpu_set", action="store", dest="cpu_set",
                        help="run on cpu set", default="")
    parser.add_argument("-x", "--xperf", action="store_true", dest="xperf",
                        help="collect call stacks with python-flamegraph", default=False)
    args = parser.parse_args()

    print("Server starting with master pid {}".format(posix.getpid()))
    posix.setpgid(0, 0)
    register_signal_handler_for_master()

    if args.xperf:
        dest_dir = "xperf-log/{}".format(datetime.datetime.utcnow().timestamp())
        os.system("mkdir -p {}".format(dest_dir))

    port = args.port
    if not args.multi_port:
        http_server = HTTPServer(WSGIContainer(app))
        http_server.bind(port)
        #http_server.start(args.num_processes)
        tornado.process.fork_processes(args.num_processes)
        sockets = http_server._pending_sockets
        http_server._pending_sockets = []
        http_server.add_sockets(sockets)
    else:
        tornado.process.fork_processes(args.num_processes)
        sockets = tornado.netutil.bind_sokets(args.port + tornado.process.task_id())
        http_server = HTTPServer(WSGIContainer(app))
        http_server.add_sockets(sockets)

    thread = None
    if args.xperf:
        from flamegraph.flamegraph import ProfileThread
        thread = ProfileThread(open("{}/perf-{}.log".format(dest_dir, posix.getpid()), "w"), 0.001, None)
        thread.start()

    register_signal_handler_for_worker(thread)
    IOLoop.instance().start()