介绍swoole模块中,进程的构成。
概述
swoole的进程由master进程,manager进程,worker进程,task进程组成。
master与manager进程只会有一个,worker与task进程根据配置可能会产生多个。
worker_num
设置启动的Worker进程数,默认为SWOOLE_CPU_NUM(逻辑cpu个数)。最好为cpu的1-4倍,不超过100倍。
1.不设置worke_num
不手动设置worker进程数,默认为逻辑cpu的个数。
逻辑cpu为1,加上master与manager总共为3个。
逻辑cpu为4,加上master与manager总共为6个。
2.设置worke_num
手动启动3个worker进程,加上master与manager总共为5个。
手动启动6个worker进程,加上master与manager总共为8个。
task_worker_num
设置启动的Task进程数,默认不启动,需要自己手动配置。
设置worke_num=3,task_worker_num=3
worker与task进程,加上master与manager总共为8个。
设置worke_num=3,task_worker_num=6
worker与task进程,加上master与manager总共为11个。
worker进程与task进程的区别
从上面可以看出worker进程与task进程是并列的,task进程并不属于某个worker进程,那为什么有了worker还需要task呢?
swoole中任务的处理流程如下图,服务器接收到客户端的处理请求可以直接在worker中进行处理,如果处理的耗时较长,可将任务异步投递到空闲的task中处理(如果任务异步处理的话),这样worker就可以接收新的客户端处理请求,从而提高了服务器处理任务的速度。
为了验证实际情况是不是如上面说的,进行如下测试,服务端开启3个worker,2个task。
- taskworker:当前工作进程为task进程还是worker进程
- work_id:当前工作进程的编号[0-(worker_num+task_num-1)],按worker+task顺序编号
- work_pid:当前工作进程对应的系统进程id
- src_worker_id:当前task进程处理的任务来自哪个worker进程
- task_id:swoole自动生成的任务编号,src_worker_id+task_id为全局唯一
测试结果
多个worker会调用相同的task处理。
相同的worker会调用不同的task处理。