worker初学者 目前正在读手册,读到设置worker进程数和onWorkerReload属性时产生疑问 想知道在使用worker的过程中,worker实例的多个进程分别是什么时候启动的,onWorkerReload属性的讲解中,子进程又是什么?在文档-接口-stopAll中,也出现类似表述。
1. worker实例的多个进程分别是在 workerman 执行完【上下文环境检测 --> worker各种初始化 ---> 信号安装】等环节后分别fork 启动各个实例的子进程的,在应用层代码里就是 onWorkerStart 回调即代表成功启动了该子进程。 2. 子进程是什么? 子进程就是由父进程派生fork出来的进程,父进程专门用于管理子进程,要时刻监控子进程以便子进程退出时能够正常回收子进程,防止产生僵尸进程,不处理任何业务,而子进程则用来处理外部请求。
是不是这样: workerman会有一个主进程,然后所有的worker实例里设置的count个进程全部都是子进程
准确的说:
@614:嗯嗯 懂了。谢谢!
@5344 不客气
@614:想追问个问题,假如worker->count设定4个子进程编号0123,启动后先后进来10个连接,如何分配给4个子进程,是均衡分配,还是一个子进程满之后再由第二个子进程来处理??
@614:
设置Worker->count = 4; public function onMessage($connection, $data) { $worker = $connection->worker;//$worker 。。。。。 foreach($worker->connections as $con){。。。。} }
文档中说,$worker是当前connection对象所属的worker实例,那么这个$worker是主进程还是子进程?遍历获取的$con涵盖所有子进程上的连接吗?
@614:我在用workerman写聊天室,如果设置多个子进程,那么接受用户聊天信息后就要群发,而 $connection->worker只能获取到当前进程下的连接。那么就需要再去使用channel组件是吗?
@5344: 1、群发与否与你采用单进程还是多进程开发并没有什么直接的关系。 2、workerman的单进程模型下做群发或单发处理起来很简单,因为所有的连接都在一个进程内接受维护。 3、workerman的多进程模型开发时,无论是私聊还是群发,必须考虑多进程间的通信,这点正是你提问的问题所在了,多进程通信的手段有很多,比如官方的channel组件、globaldata组件、以及很多消息队列组件等等。 4、最后建议使用gatewayworker, 官方已经帮细节都实现好了,拿来即用;当然基于workerman自己搞也完全可以,只不过利用workerman开发聊天系统需要具备多进程模型定制能力,要考虑很多细节问题。
@614:感谢!
1. worker实例的多个进程分别是在 workerman 执行完【上下文环境检测 --> worker各种初始化 ---> 信号安装】等环节后分别fork 启动各个实例的子进程的,在应用层代码里就是 onWorkerStart 回调即代表成功启动了该子进程。
2. 子进程是什么? 子进程就是由父进程派生fork出来的进程,父进程专门用于管理子进程,要时刻监控子进程以便子进程退出时能够正常回收子进程,防止产生僵尸进程,不处理任何业务,而子进程则用来处理外部请求。
是不是这样:
workerman会有一个主进程,然后所有的worker实例里设置的count个进程全部都是子进程
准确的说:
@614:嗯嗯 懂了。谢谢!
@5344 不客气
@614:想追问个问题,假如worker->count设定4个子进程编号0123,启动后先后进来10个连接,如何分配给4个子进程,是均衡分配,还是一个子进程满之后再由第二个子进程来处理??
@614:
设置Worker->count = 4;
public function onMessage($connection, $data)
{
$worker = $connection->worker;//$worker
。。。。。
foreach($worker->connections as $con){。。。。}
}
文档中说,$worker是当前connection对象所属的worker实例,那么这个$worker是主进程还是子进程?遍历获取的$con涵盖所有子进程上的连接吗?
@614:我在用workerman写聊天室,如果设置多个子进程,那么接受用户聊天信息后就要群发,而 $connection->worker只能获取到当前进程下的连接。那么就需要再去使用channel组件是吗?
@5344:
1、群发与否与你采用单进程还是多进程开发并没有什么直接的关系。
2、workerman的单进程模型下做群发或单发处理起来很简单,因为所有的连接都在一个进程内接受维护。
3、workerman的多进程模型开发时,无论是私聊还是群发,必须考虑多进程间的通信,这点正是你提问的问题所在了,多进程通信的手段有很多,比如官方的channel组件、globaldata组件、以及很多消息队列组件等等。
4、最后建议使用gatewayworker, 官方已经帮细节都实现好了,拿来即用;当然基于workerman自己搞也完全可以,只不过利用workerman开发聊天系统需要具备多进程模型定制能力,要考虑很多细节问题。
@614:感谢!