码迷,mamicode.com
首页 > 系统相关 > 详细

半同步/半异步进程池实现流程

时间:2021-05-24 07:43:26      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:setup   内核   child   sign   查看   管理   pipe   实现   单例模式   

进程池的基本思想
  由主进程管理所有监听socket,而各个子进程分别管理属于自己的连接的socket,子进程可以自己调用accept来接受新连接,这样父进程就无需向子进程传递socket,而只需要简单的说一声."我检测到了有新的连接,你来接受一下“

进程池的代码逻辑
  每个进程类都有一个m_pid用来标识自己,还有一个管道成员来统一信号源,处理信号事件
  进程池类使用单例模式创建,其构造函数为private,该类任何时刻只能有一个实例对象。通过create函数创建对象
  进程池类的构造函数中创建好process_number个子进程,将每个每个子进程的pid赋给子进程对象的成员m_pid,同时为每个进程创建一根与父进程通信的双向管道
  双向管道的一端既能读也能写,但如果从pipe[0]写入,只能从pipe[1]读出
  进程池类中的m_idx成员用来标识每个子进程在进程池中的序号,父进程的m_idx为-1;
  run函数通过m_idx判断接下来是执行子进程的代码还是父进程的代码
  所有进程通过m_stop这个bool值来决定是否退出
run_parent()的代码逻辑
  通过setup_sig_pipe创建同一事件源的信号管道
  父进程有自己的epoll事件循环,每当有新的连接到来时,就采用Round Robin算法将新连接分配给一个子进程处理,被分配地子进程必须是“活着地”,通过其m_pid成员是否不等于 -1判断,父进程通过m_pipefd管道成员来通知子进程接受新连接
  信号通过sig_pipefd管道传给父进程,父进程使用signals数组存储收到的信号,并逐个处理信号,当收到SIGCHLD信号时,表示有子进程退出,使用waitpid无阻塞地回收子进程,遍历子进程数组,通过对比pid和每个子进程地m_pid成员,找到退出地子进程,将其                  m_pid设为-1,标识该进程已退出
  遍历子进程数组,查看是否所有子进程地m_pid都为-1,如果是,则父进程也退出(m_stop = true);
  当收到SIGTERM和SIGINT信号时,杀死所有子进程
run_child()代码逻辑
  通过setup_sig_pipe创建统一事件源的信号管道
  每个子进程也有自己的epoll事件循环,当m_pipefd管道上有可读事件发生时,表示有新的连接到来,处理这个新的socket连接,并将它得读写事件注册到自己得epoll内核事件表
  处理信号事件的逻辑和父进程类似但更简单多
  处理客户请求,调用逻辑处理对象的process办法处理之
————————————————
版权声明:本文为CSDN博主「天健园扛把子」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36087425/article/details/90473598

半同步/半异步进程池实现流程

标签:setup   内核   child   sign   查看   管理   pipe   实现   单例模式   

原文地址:https://www.cnblogs.com/hxl-learning-space/p/14764072.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!