• SpProcPool阅读笔记--1


    公司产品用了一个开源的框架,最近出了点问题,细看了这个框架。

    SpProcPool:  https://github.com/spsoft/spprocpool.git

    我们的线程池用的是传递文件描述符这套,这里主要记录主如何把收到的sockfd丢给子处理的。

    主启动 : SP_ProcInetServer::start()

    SP_ProcInetServer::start()里构造了SP_ProcManager procManager,执行procManager.start()。start方法里做了很多事,建了一个全双工管道(用来传递WorkerProecss 创建的全双工管道一端) pipeFd[ 2 ] = {USED_BY_PARENT, USED_BY_CHILD},后fork进程,父拿到USED_BY_PARENT pipeFd[0](写,给父传WorkerProecss 的读端),构造进程池信息,子ChildProcess一直(loop)做pipeFd[0]的对端pipeFd[1](读)的读recv_fd ,读出的实际是WorkerProecss 创建时,通过pipeFd[0]传过来的实际的WorkerProecss 待读端,调用worker->process去读真实上来的socketFd,worker拿到socketFd,取数据做具体的业务处理。

    SP_ProcInetServer::start()之后就是从进程池里拿进程WorkerProecss来处理accept上来的socketFd,具体的处理就是发送出去SP_ProcPduUtils::send_fd( workerProcessPipeFd[0], clientFd ), 上说到的ChildProcess会在loop中从workerProcessPipeFd[1]中拿到实际的socketFd,然后进行业务处理。

    PS:

    a)主进程:1个,主要工作是创建Manager进程,从Manager进程池中取进程(实际是进程之间通信的管道信息)来处理accept 上来的socketFd(实际就是把收到的socketFd发出去,让WorkProcess来处理)。

    b) Manager进程: 1个,构造全双工管道,一端给主进程写(写workProcessInfo创建时的创建的全双工管道一端),另一端自己用来读写入的内容(Manager进程是主fork出的子)

    c) Worker进程:N个,进程池中无可用,创建 进程管道信息,管道信息一端通过pipeFd[0]发(主进程中),触发Manager进程中创建Worker进程,创建之后,长读、等实际要上送的socketFd

    d) 主、Manager、Worker之间的关系:   主-fork->  Manager-fork->  Worker-fork

    e)关于send_fd,recv_fd:

    [03-04 01:09:00][spprocpdu.cpp_144][PID_651][信息中心][DEBUG] send_fd: [5] [6].
    [03-04 01:09:04][spprocpdu.cpp_144][PID_651][信息中心][DEBUG] send_fd: [7] [6].
    [03-04 01:09:05][spprocpdu.cpp_144][PID_651][信息中心][DEBUG] send_fd: [7] [6].

    [03-04 01:09:00][spprocpdu.cpp_137][PID_658][信息中心][DEBUG] recv_fd :[6] [5].  -- 这里为什么收到的不是[6][6],纠结了下,参考文件描述符理解
    [03-04 01:09:04][spprocpdu.cpp_137][PID_659][信息中心][DEBUG] recv_fd :[5] [7].  -- 这里为什么收到的不是[5][6],参考文件描述符理解
    [03-04 01:09:05][spprocpdu.cpp_137][PID_659][信息中心][DEBUG] recv_fd :[5] [7].

    套接字是一个特殊的文件描述符。以前理解有误。参考:https://blog.csdn.net/cywosp/article/details/38965239 这个来理解文件描述符

    其它,当前只看了SpProcPool 传文件描述符这块,还有其它的方式,有空看下。

  • 相关阅读:
    【手机网络游戏 编程】C#异步socketAPI调用 处理数据的流程
    【已解决】unity4.2.0f4 导出Android工程报错:Error building Player: ArgumentException: Illegal characters in path. [unity导出android工程 报错,路径含有非法字符]
    【已解决】Android微信开放平台,申请移动应用的 应用签名 如何获取
    【keytool jarsigner工具的使用】Android 使用JDK1.7的工具 进行APK文件的签名,以及keystore文件的使用
    JavaScript闭包浅谈
    C#接口和抽象类的区别
    .NET中的垃圾回收
    访问修饰符(public,private,protected,internal,sealed,abstract)
    C#.NET里面抽象类和接口有什么区别?
    在 ASP.NET 中执行 URL 重写的方法
  • 原文地址:https://www.cnblogs.com/ashen/p/10474616.html
Copyright © 2020-2023  润新知