workerman里的进程与子进程

jackie

worker初学者
 
目前正在读手册,读到设置worker进程数和onWorkerReload属性时产生疑问
 
想知道在使用worker的过程中,worker实例的多个进程分别是什么时候启动的,onWorkerReload属性的讲解中,子进程又是什么?在文档-接口-stopAll中,也出现类似表述。
 

阅读 2609
1个回答

blogdaren

1.   worker实例的多个进程分别是在 workerman 执行完【上下文环境检测 --> worker各种初始化 ---> 信号安装】等环节后分别fork 启动各个实例的子进程的,在应用层代码里就是 onWorkerStart 回调即代表成功启动了该子进程。
2.  子进程是什么? 子进程就是由父进程派生fork出来的进程,父进程专门用于管理子进程,要时刻监控子进程以便子进程退出时能够正常回收子进程,防止产生僵尸进程,不处理任何业务,而子进程则用来处理外部请求。

  • jackie 2019-01-24

    是不是这样:
    workerman会有一个主进程,然后所有的worker实例里设置的count个进程全部都是子进程

  • blogdaren 2019-01-24

    准确的说:

    1. workerman会有一个主进程或多个主进程【是否有多个主进程是取决于你一次性触发了多少个启动脚本如何编写启动脚本】
    2. $worker->count 即代表当前worker实例启动多少个子进程,是的,这里的count落地的是子进程。
  • jackie 2019-01-24

    @614:嗯嗯 懂了。谢谢!

  • blogdaren 2019-01-24

    @5344 不客气

  • jackie 2019-02-15

    @614:想追问个问题,假如worker->count设定4个子进程编号0123,启动后先后进来10个连接,如何分配给4个子进程,是均衡分配,还是一个子进程满之后再由第二个子进程来处理??

  • blogdaren 2019-02-15
    1. 默认不会均衡分配,会由系统内核调度某个空闲的进程处理连接。
    2. 如果想达到均衡分配,需要开启$worker->reusePort = true
  • jackie 2019-02-15

    @614:

    设置Worker->count = 4;
    public function onMessage($connection, $data)
    {
    $worker = $connection->worker;//$worker
    。。。。。
    foreach($worker->connections as $con){。。。。}
    }

    文档中说,$worker是当前connection对象所属的worker实例,那么这个$worker是主进程还是子进程?遍历获取的$con涵盖所有子进程上的连接吗?

  • blogdaren 2019-02-15
    1. 位于onXXXX回调里的代码都是子进程的代码空间,所以这里的$worker自然是隶属子进程。
    2. 遍历获取的$con 只是当前子进程维持的连接,并不是所有进程的。
  • jackie 2019-02-18

    @614:我在用workerman写聊天室,如果设置多个子进程,那么接受用户聊天信息后就要群发,而 $connection->worker只能获取到当前进程下的连接。那么就需要再去使用channel组件是吗?

  • blogdaren 2019-02-18

    @5344:
    1、群发与否与你采用单进程还是多进程开发并没有什么直接的关系。
    2、workerman的单进程模型下做群发或单发处理起来很简单,因为所有的连接都在一个进程内接受维护。
    3、workerman的多进程模型开发时,无论是私聊还是群发,必须考虑多进程间的通信,这点正是你提问的问题所在了,多进程通信的手段有很多,比如官方的channel组件、globaldata组件、以及很多消息队列组件等等。
    4、最后建议使用gatewayworker, 官方已经帮细节都实现好了,拿来即用;当然基于workerman自己搞也完全可以,只不过利用workerman开发聊天系统需要具备多进程模型定制能力,要考虑很多细节问题。

  • jackie 2019-02-19

    @614:感谢!