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

Posted 小码农2

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了半同步/半异步进程池实现流程相关的知识,希望对你有一定的参考价值。

进程池的基本思想
  由主进程管理所有监听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

以上是关于半同步/半异步进程池实现流程的主要内容,如果未能解决你的问题,请参考以下文章

C++11实现半同步半异步的线程池

半同步半异步高性能网络编程

Linux:进程池实现

半同步半异步I/O的设计模式(half sync/half async)

线程同步之条件变量使用手记

Mariadb的半同步复制