当前位置: 首页 > 后端技术 > PHP

Swoolev4.7新特性预览的Process-Pool--detach()

时间:2023-03-29 15:13:11 PHP

Process\Pool是Swoole提供的进程池。它是基于Server的Manager管理进程模块实现的,可以管理多个工作进程。该模块的核心功能是进程管理。与Process实现多进程相比,Process\Pool更简单,封装程度更高。开发者无需编写过多代码即可实现进程管理功能。使用Coroutine\Server,可以创建纯协程Style,可以发挥多核CPU服务器程序的优势。在4.7版本中,Process\Pool添加了一个detach方法。这个方法名是不是很眼熟?Http\Response中还有一个detach方法,它的作用是detach响应对象。使用该方法后$response对象销毁时不会自动结束,与Http\Response::create和Server->send配合使用。该方法的作用Process\Pool::detach()的作用很明显:进程池中的当前Worker进程脱离了管理,底层会立即创建新的进程。老进程不再处理数据,应用层代码自己管理。生命周期。示例代码看一下示例代码:useSwoole\Process;useSwoole\Coroutine;$pool=newProcess\Pool(2);$pool->set(['enable_coroutine'=>true]);$pool->on('WorkerStart',function(Process\Pool$pool,$workerId){static$running=true;Process::signal(SIGTERM,function()use(&$running){$running=false;echo"TERM\n";});echo("[Worker#{$workerId}]WorkerStart,pid:".posix_getpid()."\n");$i=0;while($running){Coroutine::sleep(1);$i++;如果($i==5){$pool->detach();}elseif($i==10){break;}}});$pool->on('WorkerStop',function(Process\Pool$pool,$workerId){echo("[Worker#{$workerId}]WorkerStop,pid:".posix_getpid()."\n");});$池->开始();在WorkerStart中,通过Process::signal设置了一个异步信号监听器,可以通过发送SIGTERM信号停止服务。服务运行时,当$i等于5时,当前进程将脱离管理;同时在底层会创建一个新的进程来维护worker_num的数量;当$i等于10时,该过程将结束。所以你得到以下输出:[Worker#0]WorkerStart,pid:75050[Worker#1]WorkerStart,pid:75051[Worker#0]WorkerStart,pid:75054[Worker#1]WorkerStart,pid:75055[Worker#0]WorkerStop,pid:75050[Worker#1]WorkerStop,pid:75051[Worker#1]WorkerStart,pid:75056[Worker#0]WorkerStart,pid:75057上面代码中相当于维护了4个进程。退出后,会再次启动两个新的进程,以此类推。使用时要特别注意逻辑问题,否则可能会导致无限创建新进程。