swoole提供了创建进程的简便方式,同时如果有进程池的需求,也是可以快速上手,因公司swoole较老,swoole原生提供的进程池不能使用,这里就用swoole_process实现了多进程处理耗时任务的需求。
这次的背景是这样的,有个每分钟1次的定时任务,这个定时任务启动后,会循环请求多个agent上的数据,最初的实现是通过for循环去请求各个agent的数据进行处理,这种模式有个固有缺陷,即单个agent的超时会操作后续其他agent的开始处理时间延长,而我们的业务必须是每次调度时,需要尽快把各个agent的数据处理完。
后续为了规避单个agent的超时影响,将原有的各个agent的处理拆分为多进程处理,规避了单个agent超时造成的影响。
下面的实现是每次fork进程,处理完业务后就退出了,这种模式不适合需要频繁启动进程的模式,因为太耗资源,请大家在学习时,注意抉择。
<?php
class ProcessRequestOneExistPool
{
private $worker = [];
private $work_num = 0;
private $start_time = null;
public function __construct($work_num)
{
$this->work_num = $work_num;
}
public function start($callable)
{
$this->start_time = microtime(true);
for ($i=0;$i<$this->work_num;$i+