larval的计划任务以及任务队列不能够支持并发限制。如果每分钟都执行long task,不加限制情况下很容易造成同时执行大量long task,导致服务器资源被占用完。
虽然可以通过withoutOverlapping的方式指定command的单例执行。但是很多情况下不能满足业务场景。
为了既能满足任务并发,又可以限制并发数量。做了一种类似线程池的结构作为限制。代码如下
class ThreadPool
{
/**
* 池大小
* @var int|mixed
*/
private $pool_size;
/**
* 默认单位为分钟
* @var
*/
private $check_dead_limit;
/**
* 是否需要自己抛出进程
* @var int|mixed
*/
// private $is_self_thread ;
/**
* 进程数组
* @var array
*/
// private $threads_array ;
/**
* redis 数据存储
* @var
*/
private $redis_threads;
/**
* redis key前缀
* @var
*/
private $redis_threads_key_pre ;
/**
* 供应商id
* @var int
*/
private $supplier_id;
/**
* User: Today
* Email: [email protected]
* @param ${PARAM_LIST}
* ThreadPool constructor.
*/
function __construct( )
{
// $this->redis_threads_key_pre = 'Threads:Report:' . $supplier_id ;
//每个供应商并发数设置
$this->pool_size = config('sys.export_pool_size');;
//检测超时 分钟
$this->check_dead_limit = config('sys.check_dead_limit') ;
$this->redis_threads_key_pre = 'Threads:Export:';
// $this->is_self_thread = false;
// $this->threads_array = array();
}
/**
* @return mixed
*/
public function getRedisThreadsKeyPre()
{
$pre_key = $