一直在线上使用nginx tornado多实例的部署方式,在看tornado源码的时候,看到 tornado.process 多进程逻辑。
该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新。http://xiaorui.cc/?p=105
随后测试了下tornado的 tornado.process模块, 结果性能方面不咋地。 他的实现原理也很简单,就是主进程实例化listen fd,然后fork子进程,这样子进程继承了父进程的listen fd . 当一个新连接过来的时候,多个子进程如果都在accept,那么会出现惊群操作,当然最后只有一个进程accept拿到数据。
每个子进程有单独的epoll池里,不仅要监控listen fd,而且要监控 已经建连的连接。
另外,tornado多进程的性能咋样? 不怎么样…. 也就用用…
#!/usr/bin/env python # -*- coding:utf-8 -*- import os import time import tornado.web import tornado.httpserver import tornado.ioloop import tornado.netutil import tornado.process from tornado.options import define,options define("port",default=8001, help="run on the given port", type=int) class LongHandler(tornado.web.RequestHandler): def get(self): time.sleep(3) self.write(str(os.getpid())) if __name__ == "__main__": tornado.options.parse_command_line() app = tornado.web.Application(([r'/', LongHandler], )) sockets = tornado.netutil.bind_sockets(8090) tornado.process.fork_processes(100) server = tornado.httpserver.HTTPServer(app) # server.listen(options.port) server.add_sockets(sockets) tornado.ioloop.IOLoop.instance().start()
END.