编程学习网 > PHP技术 > swoole > swoole v4.7 版本Process\Pool配合coroutine server创建纯协程风格
2021
07-03

swoole v4.7 版本Process\Pool配合coroutine server创建纯协程风格

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


该模块的核心功能为进程管理,相比 Process 实现多进程,Process\Pool 更加简单,封装层次更高,开发者无需编写过多代码即可实现进程管理功能,配合 Coroutine\Server 可以创建纯协程风格的,能利用多核 CPU 的服务端程序。


在 4.7 版本中,对 Process\Pool 增加了一个 detach 方法,这个方法名看起来很眼熟吧?


在 Http\Response 中也有一个 detach 方法,它的作用是分离响应对象。使用此方法后,$response 对象销毁时不会自动 end,与 Http\Response::create 和 Server->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 个进程,在一次退出后又会重新拉起两个新的进程,如是往复。


在使用时就需要特别注意逻辑问题,否则可能会导致无限创建新的进程。

以上就是“swoole v4.7 版本Process\Pool配合coroutine server创建纯协程风格”的详细内容,想要了解更多swoole教程欢迎关注编程学习网

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取