Home
Download
Document
Forum
Video
Donate
Source Code
AI 助理
Sponsors
CRMEB
Apipost
腾讯云
微擎
禅道
51Talk
Products
Swoole AI 智能文档翻译器
Swoole-Compiler PHP 代码加密器
CRMEB 新零售社交电商系统
Login
Register
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
Swoole v4.7 版本新特性预览之 Process\Pool::detach()
`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 进程脱离管理,底层会立即创建新的进程,老的进程不再处理数据,由应用层代码自行管理生命周期。 ## 示例代码 下面来看一下示例代码: ```php 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 时,结束该进程。 所以会得到以下输出: ```bash [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 个进程,在一次退出后又会重新拉起两个新的进程,如是往复。 在使用时就需要特别注意逻辑问题,否则可能会导致无限创建新的进程。 ![](https://cdn.jsdelivr.net/gh/sy-records/staticfile/images/swoole/wechat.png)
发布于3年前 · 22 次浏览 · 来自
分享
鲁飞
`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 进程脱离管理,底层会立即创建新的进程,老的进程不再处理数据,由应用层代码自行管理生命周期。 ## 示例代码 下面来看一下示例代码: ```php 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 时,结束该进程。 所以会得到以下输出: ```bash [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 个进程,在一次退出后又会重新拉起两个新的进程,如是往复。 在使用时就需要特别注意逻辑问题,否则可能会导致无限创建新的进程。 ![](https://cdn.jsdelivr.net/gh/sy-records/staticfile/images/swoole/wechat.png)
赞
3
分享
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
评论
还没有评论!
微信公众号
热门内容
作者其它话题
- thinkphp5.1在使用think-swoole的时候报错unsupported option [host]
- WSL 下服务器响应数据过大无法接收
暂无回复的问答
- CodeGalaxy K3s 轻量集群节点之间如何实现负载均衡
- 关于openssl CURL WARNING swSSL_connect: SSL_connect(fd=69) failed. Error: error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small[1|394]
- 多个模型如何进行事务异常回退?
- websocket开启wss报错
- 协程tcp服务器如何使用多进程?recv()方法接收信息,打印出来的pid一直是同一个。没用使用到多进程啊。