引子
Tornado 是一个网络异步的的web开发框架, 并且可以利用多进程进行提高效率, 下面是创建一个多进程 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 class LongHandler(tornado.web.RequestHandler): def get(self): self.write(str(os.getpid())) time.sleep(10) if __name__ == "__main__": app = tornado.web.Application(([r'/', LongHandler], )) sockets = tornado.netutil.bind_sockets(8090) tornado.process.fork_processes(2) server = tornado.httpserver.HTTPServer(app) server.add_sockets(sockets) tornado.ioloop.IOLoop.instance().start()
上面代码使用 tornado.process.fork_processes 创建了2个子进程, 同时用时访问这个 服务两次, 分别会返回两个相邻的pid. 可以看到 tornado 确实使用了两个进程来同时完成任务.
我一直很好奇 tornado 是如何将请求调度到子进程, 多个子进程又如何不同时处理一个请求呢?
探究
我们首先是调用 tornado.netutil.bind_sockets 来创建一个 socket(或一个 socket 列表),