我编写了一个Laravel任务,它从db读取数据,调用shell脚本来处理数据,并将结果保存到db。任务排队非常快,队列中始终存在多个任务。我注意到任务不是逐个执行的,而是同时执行几个任务。一般来说,这是一个很好的原则,但似乎我调用的shell脚本(这是第三方,我无法修改它)不是线程安全的,并且在多个任务同时调用时会产生问题。当我同步执行任务功能时,作为主要过程的一部分,一切顺利。
我想知道的是,是否可以一次告诉Laravel队列进程一个任务,因为我仍然希望将此作业从我的主处理中分离出来,但也必须避免这些错误。我在Laravel 5上,使用默认的' sync'队列方法。
答案 0 :(得分:0)
关于同时执行的任务,您是否尝试添加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();
答案 1 :(得分:0)
我找不到适合我需要的答案,并且这个问题出现在“ laravel限制一项工作”的前10个搜索结果中,因此,我决定与我分享这个问题的解决方案。也许会帮助别人。
我的API请求有重叠的作业,导致外部服务器上出现500错误。为了克服这个问题,我想将执行限制为一项工作。
对我来说,最简单的解决方案是为一个特定队列创建另一个Supervisor配置文件-在我的情况下为“ api”-我使用numprocs=1
命令将其限制在一个过程中
此后,我可以将所有API作业分派给外部服务器以将“ api”排队,并且它们永远不会重叠。
我不知道这是否是最好的方法,但是它以最小的努力解决了我的问题。