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

时间:2015-08-09 10:02:54

标签: php multithreading thread-safety queue laravel-5

我编写了一个Laravel任务,它从db读取数据,调用shell脚本来处理数据,并将结果保存到db。任务排队非常快,队列中始终存在多个任务。我注意到任务不是逐个执行的,而是同时执行几个任务。一般来说,这是一个很好的原则,但似乎我调用的shell脚本(这是第三方,我无法修改它)不是线程安全的,并且在多个任务同时调用时会产生问题。当我同步执行任务功能时,作为主要过程的一部分,一切顺利。

我想知道的是,是否可以一次告诉Laravel队列进程一个任务,因为我仍然希望将此作业从我的主处理中分离出来,但也必须避免这些错误。我在Laravel 5上,使用默认的' sync'队列方法。

2 个答案:

答案 0 :(得分:0)

关于同时执行的任务,您是否尝试添加withoutOverlappinghttp://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”排队,并且它们永远不会重叠。

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