我写了一个Laravel任务,它从db读取数据,调用shell脚本来处理数据,并将结果保存到db。任务排队非常快,队列中总是存在多个任务。我注意到任务不是一个接一个地执行,而是同时执行几个任务。一般来说,这是一个很好的原则,但似乎我调用的shell脚本(这是第三方的,我不能修改它)不是线程安全的,当多个任务同时调用时,它会产生问题。当我同步执行任务函数时,作为主进程的一部分,一切都很顺利。
我想知道的是,如果有可能告诉Laravel队列一次处理一个任务,因为我仍然想从我的主处理中分离这个任务,但也必须避免这些错误。我是在Laravel 5,使用默认的'sync'队列方法。
关于同时执行的任务,您是否尝试添加withoutOverlapping
?http://laravel.com/docs/5.1/scheduling preventing-task-overlaps
如果你使用闭包调用,你还需要添加name
$schedule->call(function () {
DB::table('users')->insert([
'user_id' => '3',
'name' => 'anton'
]);
})->everyHour()
->name('nyanpasu')
->withoutOverlapping();
我找不到任何符合我需求的答案,而这个问题在"laravel limit one job"的搜索结果中排在前10位,所以我决定分享我对这个问题的解决方案。也许它会帮助别人。
我有一个API请求的工作重叠,导致外部服务器上出现500个错误。为了解决这个问题,我想将执行限制为一个作业。
对我来说最简单的解决方案是为一个特定队列创建另一个Supervisor配置文件 -在我的情况下是"api"-我在配置中使用numprocs=1
命令将其限制为一个进程。
在此之后,我可以为外部服务器调度所有API作业以排队"API",并且它们永远不会重叠。
我不知道这是不是最好的方法,但是它用最少的努力解决了我的问题。