概述Swoole启动一个服务,启动了哪些进程和线程?为了解决这个问题,我们先启动一个最简单的服务,看看启动了哪些进程和线程?然后结合官网运行流程图对各个进程和线程进行分类。服务启动后,打印出当前Swoole版本和当前CPU核数。打印Swoole版本,方便大家下载这个版本运行代码。打印CPU核数是因为下面会用到这个参数。废话不多说,直接看代码。代码serv.phpserv=newswoole_server("0.0.0.0",9502);$this->serv->set(['worker_num'=>3,'task_worker_num'=>3,]);$this->serv->on('开始',function($serv){echo"SWOOLE:".SWOOLE_VERSION."Servicestarted".PHP_EOL;echo"SWOOLE_CPU_NUM:".swoole_cpu_num().PHP_EOL;});$this->serv->on('接收',函数($serv,$fd,$from_id,$data){});$this->serv->on('Task',function($serv,$task){});$this->serv->on('完成',函数($serv,$task_id,$data){});$this->serv->start();}}$server=newServer();上面的代码简单的说创建了一个TCP服务器,启动了3个worker进程和3个task进程,因为开启了task功能,所以必须注册onTask和onFinish事件的回调函数。我们运行一下:用ps查看:16390的父进程是16389,16393、16394、16395、16396、16397、16398的父进程是16390,你有没有发现,16391和16392跑到哪里去了?是不是很奇怪。然后用pstree查看:出来了,16391和16392是线程,16390是同级进程。现在我们了解到启动的服务使用了8个进程和2个线程。我们看一下SwooleServer官方文档:https://wiki.swoole.com/wiki/...看这张图:从上图我们可以得出16389是Master进程。16390是Manager进程。16391、16392是Reactor线程。16393、16394、16395、16396、16397、16398包括3个Worker进程和3个Task进程。小结1、为什么会有3个Worker进程和3个Task进程?因为,我们在创建服务的时候,设置了worker_num=3,task_worker_num=3。如果不设置worker_num,默认值为SWOOLE_CPU_NUM。我们在上面打印出来了。默认值为2,最大值为SWOOLE_CPU_NUM*1000,具体参见官方文档。worker_num文档:https://wiki.swoole.com/wiki/...task_worker_num文档:https://wiki.swoole.com/wiki/...二、为什么会有2个Reactor线程?它是做什么用的?因为,Reactor线程数默认是SWOOLE_CPU_NUM,也可以通过reactor_num参数设置。reactor_num文档:https://wiki.swoole.com/wiki/...是真正处理TCP连接和收发数据的线程。Reactor线程文档:https://wiki.swoole.com/wiki/...3、Reactor、Worker、TaskWorker是什么关系?一个通俗的比喻,假设Server是工厂,那么Reactor就是销售,接受客户的订单。工人是工人。当销售员接到订单时,工人就开始工作,生产客户想要的东西。而TaskWorker可以理解为管理员,可以帮助Worker处理杂务,让Worker专心工作。官方已经解释的很详细了,请阅读官方文档:https://wiki.swoole.com/wiki/...如果你想入门Swoole,可以看这篇《Swoole 文章汇总(10 篇)》。一起学习
