Swoole v4.7 版本新特性預覽之 Process\Pool::detach()

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::createServer->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 個進程,在一次退出後又會從新拉起兩個新的進程,如是往復。

在使用時就須要特別注意邏輯問題,不然可能會致使無限建立新的進程。