Process\Pool
是 Swoole 提供的进程池,基于 Server
的 Manager 管理进程模块实现,可管理多个工做进程。php
该模块的核心功能为进程管理,相比 Process
实现多进程,Process\Pool
更加简单,封装层次更高,开发者无需编写过多代码便可实现进程管理功能,配合 Coroutine\Server
能够建立纯协程风格的,能利用多核 CPU 的服务端程序。bash
在 4.7 版本中,对 Process\Pool
增长了一个 detach
方法,这个方法名看起来很眼熟吧?异步
在 Http\Response
中也有一个 detach
方法,它的做用是分离响应对象。使用此方法后,$response
对象销毁时不会自动 end
,与 Http\Response::create
和 Server->send
配合使用。spa
那么Process\Pool::detach()
的做用也就很明显了:code
将进程池内当前 Worker 进程脱离管理,底层会当即建立新的进程,老的进程再也不处理数据,由应用层代码自行管理生命周期。协程
下面来看一下示例代码:对象
use Swoole\Process; use Swoole\Coroutine; $pool = new Process\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++; if ($i == 5) { $pool->detach(); } elseif ($i == 10) { break; } } }); $pool->on('WorkerStop', function (Process\Pool $pool, $workerId) { echo("[Worker #{$workerId}] WorkerStop, pid: " . posix_getpid() . "\n"); }); $pool->start();
在 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 个进程,在一次退出后又会从新拉起两个新的进程,如是往复。
在使用时就须要特别注意逻辑问题,不然可能会致使无限建立新的进程。