父进程负责创建子进程并且监控是否有子进程退出, 如果有, 那么再次创建出子进程;而子进程是worker, 是具体执行服务器操作的工作者, 在被创建完毕之后退出循环, 去做下面的事情.而如果父进程退出这个循环, 那么一定是srv_shutdown或者graceful_shutdown之一变为了非零值, 所以在循环外, 还要进行判断, 如果是父进程, 那么就是服务器程序要退出了, 最后作一些清理的工作.
用伪码表示这部分代码就是:
如果(是 进程 而且 当前没有要求终止服务器) 就一直循环下去
{
如果还有未创建的子进程
{
创建出一个子进程
如果是子进程, 那么根据最上面的循环条件退出这个循环.
如果是父进程, 那么将未创建的子进程数量 - 1
}
否则 就是没有未创建的子进程
{
一直保持睡眠, 一旦发现有子进程退出父进程就苏醒, 将未创建的子进程数量 + 1;
}
}
父进程的代码永远不会执行到这个循环体之外, 一旦发生, 就是因为要终止服务器的运行, 如果这种情况发生, 就进行最后的一些清理工作....
在这之后, 各子进程分道扬镳, 各自去进行自己的工作, 互不干扰.这也是我非常喜欢多进程编程的原因, 少了多线程编程中考虑到数据同步等麻烦的事情,要考虑的事情相对而言简单的多了.
关于多进程 VS 多线程的话题, 不在这里多加阐述了.