Laravel队列——限制同时执行任务的数量


Laravel queues - limit number of simultaneous tasks

我写了一个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",并且它们永远不会重叠。

我不知道这是不是最好的方法,但是它用最少的努力解决了我的问题。