Laravel 队列在队列为空时进入睡眠状态

Ter*_*y D 0 queue performance jobs laravel

我有一个控制器函数,它调度一个job. 处理此job问题后,最后它会job再次分派相同的内容(使用不同的参数)。总共有5个相同的职位。

Queue driver: database

问题是:我记录了从create()到 的持续时间handle()。由控制器调度的第一个作业花费了 1700 毫秒,而由作业本身调度的其他作业仅花费了 40 毫秒。

Queue driver: sync

当我改用sync队列驱动程序时,所有工作都以闪电般的速度进行。

发现:

create()第一个队列作业从到花费了很长时间handle()。在此之前,队列是空的。可能是队列驱动程序的问题。

请问为什么以及如何解决?谢谢!!

更新:

TestJob在处理作业时添加了一个调度本身。这意味着队列总是有一个TestJob正在处理或等待处理。

重复我原来的工作,它们从完成created()到完成只用了不到 70 毫秒的时间handle()

结论:

我很确定这是队列驱动程序问题。看起来工作人员在队列为空时就睡着了。请问有人知道修复方法吗?

Ter*_*y D 5

我在这里发布我的答案,希望对互联网上的其他人有用。

参考

https://divinglaravel.com/queue-system/workers

回答

echo放到处后echo debug_backtrace()[1]['function'];发现队列为空时有DEFAULT VALUE of sleep,里面Illuminate\Queue\Console\WorkCommand

protected $signature = 'queue:work{--sleep=3 : 当没有可用作业时休眠的秒数}

解决方案

sleep所以解决办法是在控制台命令中提及:

php artisan queue:work --sleep=0
Run Code Online (Sandbox Code Playgroud)

谢谢阅读。