其实process.py里面只有一个重头fork_processes
看到这里其实源自看到netutil里面的TCPServer.start方法:“可以根据参数启动多个tornado进程”,start方法的源代码如下(注释已去):
def start(self, num_processes=1):
assert not self._started
self._started = True
if num_processes != 1:
process.fork_processes(num_processes)
sockets = self._pending_sockets
self._pending_sockets = []
self.add_sockets(sockets)
fork_processes做了三件事:
- 根据传入的参数,fork出相应数量的子进程并在子进程中继续执行接下来的代码(TCPServer)
- 在主进程中,维护一个无限循环,监听所有子进程的状态,一旦发现子进程挂掉了(因为异常,或者错误的返回),则立即重新fork一个新的子进程
- 当所有子进程全部干净的退出后,退出主进程
在这里发现一个和之前网上查到的评论不一致的地方,那就是我现在看到的tornado的版本2.4.1,是支持子进程异常退出后自动重启的。
同时也看到一个困惑的地方,就是针对于同一批socket链接,在多进程的情况下会有N>1个handler会响应,不知道会不会有什么冲突?等看看IOLoop再回来看看。