### 進程池管理
進程池管理其實也是基于自定義進程實現的多進程處理。為每個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采集進程服務