乐趣区

关于php:Swoole-v47-版本新特性预览之-Process\Pooldetach

Process\Pool 是 Swoole 提供的过程池,基于 Server 的 Manager 治理过程模块实现,可治理多个工作过程。

该模块的外围性能为过程治理,相比 Process 实现多过程,Process\Pool 更加简略,封装档次更高,开发者无需编写过多代码即可实现过程治理性能,配合 Coroutine\Server 能够创立纯协程格调的,能利用多核 CPU 的服务端程序。

在 4.7 版本中,对 Process\Pool 减少了一个 detach 办法,这个办法名看起来很眼生吧?

Http\Response 中也有一个 detach 办法,它的作用是拆散响应对象。应用此办法后,$response 对象销毁时不会主动 end,与 Http\Response::createServer->send 配合应用。

办法作用

那么 Process\Pool::detach() 的作用也就很显著了:

将过程池内以后 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 个过程,在一次退出后又会从新拉起两个新的过程,如是往返。

在应用时就须要特地留神逻辑问题,否则可能会导致有限创立新的过程。

退出移动版