# 對象池
SD框架中重要的概念:對象池
框架中大量的使用了對象池模式,對象池模式可以很輕松的實現對象的復用,而不必頻繁的GC和New,使得內存平滑減少泄露的風險。
那么如何使用對象池技術,以及需要注意什么呢。
## 如何使用對象池
框架提供了Pool類方便你使用對象池技術。
```
Pool::getInstance()->get(TaskCoroutine::class)->init($this->task_proxy_data, $dst_worker_id);
```
例如上面的例子,我們就獲取了TaskCoroutine的一個實例。如果對象池中沒有TaskCoroutine那么對象池會new一個出來,使用完對象后需要歸還給對象池。
```
Pool::getInstance()->push($taskCoroutine);
```
$taskCoroutine為TaskCoroutine的一個實例。
## 需要注意的
對象池技術是復用對象,減少new的次數,那么就請注意__construct構造方法只會在第一次new的時候起作用,之后便不會再調用,所以建議大家書寫對象池對象的時候用init作為初始化對象的方法并返回自身。
```
class TaskCoroutine extends CoroutineBase
{
public function __construct()
{
parent::__construct();
}
public function init($task_proxy_data, $id)
{
$this->task_proxy_data = $task_proxy_data;
$this->id = $id;
$this->send(function ($serv, $task_id, $data) {
$this->result = $data;
});
return $this;
}
}
```
每次從對象池中獲取對象的時候調用init方法進行初始化。
## 框架中的對象池
框架中Controller,Model以及協成任務等都是使用了對象池技術,所以大家應該明白為什么盡量不要在__construct函數中書寫自己的代碼,因為并不是每次使用對象都會調用__construct,只會在new的使用調用__construct方法,也就是說在__construct中聲明的參數在整個生命周期里都有效。
## 監控
2.7.0版本提供了對象池的監控大家可以訂閱'$SYS/SD-1/status'來獲取對象池的實時狀態,SD-1是本機節點的名稱。當然你還可以直接訂閱‘$SYS/#’來獲取所有監控。
VIP用戶可以獲取一個可視化的監控后臺來實時觀察對象池狀態。
- Introduction
- SD 3.X文檔連接
- 導言
- 用戶案例
- 基于Swoole擴展分布式全棧開發框架
- 選擇SD框架助力企業開發
- 捐贈SwooleDistributed項目
- 框架性能報告
- 更新日志
- VIP服務福利
- 安裝與配置
- 【推薦】全自動安裝部署
- 環境要求
- 使用Composer安裝/更新SD框架
- 通過Docker安裝
- 代碼結構
- 啟動命令
- 服務器配置
- 服務器基礎配置server.php
- 客戶端協議配置client.php
- business.php
- log.php
- 微服務及集群配置consul.php
- fileHeader.php
- mysql.php
- redis.php
- 定時任務配置timerTask.php
- 服務器端口配置ports.php
- catCache.php
- 驗證服務啟動成功
- 微服務-Consul
- 日志工具-GrayLog
- 集群-Cluster
- 內核優化
- 入門教學
- 開發流程
- 開發前必讀
- 開發規范
- 基本流程
- 框架入口
- Model數據模型
- Controller控制器
- 協程
- 協程基礎
- 迭代器
- 調度器
- 使用協程的優勢
- 通過協程的方法屏蔽異步同步的區別
- Select多路選擇器
- 協程Sleep
- 通用協程方法
- 設置超時
- 設置無異常
- 設置降級函數
- initAsynPools
- dump
- 封裝器與路由器
- 封裝器
- sendToUid
- 路由器
- sendToUids
- 對象池
- 擴展組件
- 中間件
- Redis使用介紹
- RedisAsynPool
- Redis具體使用
- sendToAll
- RedisRoute
- Redis+Lua
- Mysql使用介紹
- MysqlAsynPool
- Mysql返回值
- 如何獲取構建的mysql語句
- 如何執行一個SQL
- 如何執行事務
- stopTask
- Mysql具體使用
- 異步客戶端
- Loader
- MqttClient
- model
- SdTcpRpcPool
- task
- HttpClientPool
- view
- TcpClientPool
- AMQP
- initialization
- Memory
- destory
- Cache
- Lock
- Pool
- EventDispatcher
- Process
- Cluster
- TimerTask
- Reload
- Consul
- Context
- 自定義進程
- 進程間RPC
- $http_input
- CatCache
- $http_output
- TimerCallBack
- 專題
- HTTP專欄
- TCP專欄
- 基礎知識
- WebSocket專欄
- 微服務
- Consul配置
- RPC
- REST
- AMQP異步任務系統
- MQTT簡易服務器
- Docker化以及資源編排
- 快速搭建公司內部統一的開發環境
- 使用HTTPS/WSS
- 訂閱/發布
- 游戲專題
- 類介紹
- AppServer
- clearState
- onOpenServiceInitialization
- SwooleDistributedServer
- get_instance
- kickUid
- bindUid
- unBindUid
- coroutineUidIsOnline
- coroutineCountOnline
- setTemplateEngine
- isWebSocket
- isTaskWorker
- getSocketName
- initAsynPools
- addAsynPool
- getAsynPool
- getServerAllTaskMessage
- Controller
- onExceptionHandle
- send
- sendToUid
- sendToUids
- sendToAll
- sendToGroup
- close
- getContext
- defaultMethod
- $redis_pool
- $mysql_pool
- $request_type
- $fd
- $uid
- $client_data
- $request
- $response
- $loader
- $logger
- $server
- $config
- Model
- initialization
- destory
- View
- Task
- stopTask
- HttpInput
- postGet
- post
- get
- getPost
- getAllPostGet
- getAllHeader
- getRawContent
- cookie
- getRequestHeader
- server信息
- getRequestMethod
- getRequestUri
- getPathInfo
- HttpOutput
- setStatusHeader
- setContentType
- setHeader
- end
- setCookie
- endFile
- 單元測試