随后测试了下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()
转自:http://xiaorui.cc/2014/05/11/%E6%B5%8B%E8%AF%95tornado%E7%9A%84%E5%A4%9A%E8%BF%9B%E7%A8%8B%E6%80%A7%E8%83%BDtornado-process/