如何防止ioloop.PeriodicCallback在龙卷风tcpserver多处理模式的每个进程中运行?

时间:2016-02-01 03:54:25

标签: python multiprocessing tornado

我启动了龙卷风tcpserver,如下所示:

def main():
    server = Server()
    server.bind(8989)
    server.start(9)  # **Forks multiple sub-processes**
    io_loop = tornado.ioloop.IOLoop.instance()
    check_time = 1 * 1000  # every second
    scheduler = ioloop.PeriodicCallback(app.periodic_job,
                                    check_time,
                                    io_loop=io_loop)
    scheduler.start()
    io_loop.start()
我分叉了9个子进程,并创建了一个调度程序,我希望调度程序只运行一次但不能在每个进程中运行。我可以做什么?

1 个答案:

答案 0 :(得分:1)

您必须使用"advanced multi-process"模式而不是HTTPServer.start()fork_processes()会返回一个任务ID,因此您只能在某项任务中运行PeriodicCallback

def main():
    sockets = tornado.netutil.bind_sockets(8989)
    task_id = tornado.process.fork_processes(9)
    server = Server()
    server.add_sockets(sockets)
    io_loop = tornado.ioloop.IOLoop.instance()
    if task_id == 0:
        check_time = 1 * 1000  # every second
        scheduler = ioloop.PeriodicCallback(app.periodic_job,
                                check_time,
                                io_loop=io_loop)
        scheduler.start()
    io_loop.start()