### 进程池管理
进程池管理其实也是基于自定义进程实现的多进程处理。为每个worker进程创建绑定的进程,这些绑定的进程专门为绑定的worker服务,类似于service mesh的服务管理思想。主要包含两个类
~~~
Swoolefy\Core\Pools\PoolsManager
~~~
PoolsManager主要是管理pools创建和通信的类,具体代码可以查看源码
~~~
Swoolefy\Core\Pools\AbstractProcessPools
~~~
AbstractProcessPools是一个处理的抽象类,自定义进程处理的逻辑过程必须继承该类。主要实现三个方法:
~~~
// 此方法是自定义启动后执行的方法
public abstract function run(Process $process);
// 此方法是自定义进程kill掉时执行的方法
public abstract function onShutDown();
// 此方法是与worker通信接收worker的write数据的方法
public abstract function onReceive($str);
~~~
例如下面的一个进程,专门用来发短信的。
~~~
<?php
namespace App\Pools\TestPools;
use Swoole\Process;
use Swoolefy\Core\Swfy;
use Swoolefy\Core\Pools\AbstractProcessPools;
// 继承实现AbstractProcessPools的方法
class Sms extends AbstractProcessPools {
public $chan_mysql;
public function run(Process $process) {
// 启动时执行
$args = $this->getArgs();
//var_dump($args);
}
public function onReceive($str) {
// worker 发送str信息,这里触发短信发送,主要逻辑处理
var_dump('gggggg');
}
public function onShutDown() {}
}
~~~
### 如何创建
1、在启动类的onInit中创建注册进程池
~~~
<?php
namespace App\Init;
use Swoolefy\Core\Swfy;
use Swoolefy\Core\EventHandler;
use Swoolefy\Core\Process\ProcessManager;
use Swoolefy\Core\Pools\PoolsManager;
class Init extends EventHandler {
// 创建上面的Sms的进程,为每个worker进程创建2个sms进程来处理发短信,那么每个worker进程在处理业务时,就有专有worker进程来处理sms业务了,而且不会发生所谓多个进程争抢发送的问题,因为worker是绑定进程的
/**
* addProcess 添加创建进程并绑定当前worker进程
* @param string $processName //当前进程名称,例如sms
* @param string $processClass // 处理类
* @param int $process_num_bind_worker 每个worker绑定的进程数,也即是为每个worker附加的自定义进程数,默认绑定一个process
* @param boolean $async // 是否异步
* @param array $args // 变量参数
* @param mixed $extend_data //额外变量
PoolsManager::getInstance()->addProcessPools('sms', \App\Pools\TestPools\Sms::class, 1, true, []);
}
~~~
上面很简单就注册了worker的进程池,那么接下来如何使用呢?其实很简单
```
// 在worker进程中
PoolsManager::getInstance()->writeByProcessPoolsName('sms', "请发送sms");
```
// 在自定义进程的onReceive()中就可以接受到信息了
```
public function onReceive($str) {
// worker 发送str信息,这里触发短信发送,主要逻辑处理
var_dump($str);// 此处将打印出 "请发送sms"
}
```
那小伙伴有会问,那自定义进程如何与wroker通信呢?其实也很简单直接调用sendMessage()方法可以直接将信息发送给对应的worker进程
```
public function onReceive($str) {
// worker 发送str信息,这里触发短信发送,主要逻辑处理
var_dump($str);// 此处将打印出 "请发送sms"
// 处理完sms发送逻辑
// 调用sendMessage发信息给对应的worker进程
$this->sendMessage("自定义进程处理完了sms发送");
}
```
那么问题又来了,worker进程此时又该如何接收到绑定自定义进程发送返回的信息呢?这个也很简单,直接在 onPipeMessage($server, $src_worker_id, $message)中处理。这个方法在protocol/App/HttpServer.php中
~~~
public function onPipeMessage($server, $src_worker_id, $message) {
// 此处会输出返回的内容: "自定义进程处理完了sms发送"
var_dump($message);
~~~
至此,整个流程算是完成了。
- 欢迎使用swoolefy
- 环境说明
- 开发部署
- 安装
- 创建应用
- 启动|停止服务
- nginx代理
- 创建Controller
- 应用结构
- App应用对象
- Event请求处理
- 超全局管理
- 热更新
- inotify实现worker进程热重启
- http服务
- 应用层配置
- 协议层配置
- 路由规则
- 控制器
- 数据模型
- websocket服务
- 应用层配置
- 协议层配置
- 数据封装格式
- 控制器
- 数据模型
- 二进制数据处理
- rpc服务
- 应用层配置
- 协议程配置
- 数据包协议格式
- 服务控制器
- 服务数据模型
- udp服务
- 应用层配置
- 协议层配置
- 数据包封装格式
- 控制器
- 存在问题
- 常用组件
- log
- view
- session
- cache(redis)
- db(mysql)
- mongodb
- 其他服务管理
- 自定义进程管理
- 异步任务管理
- 内存表管理
- 定时器管理
- 异常捕捉处理
- 进程池管理
- systerm采集进程服务