# 对象池 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用户可以获取一个可视化的监控后台来实时观察对象池状态。