并行运行多个作业,然后等待它们全部完成

时间:2019-04-30 13:01:24

标签: php laravel asynchronous jobs artisan

我有很多项目,我想用它们进行计算。但是同步处理需要太多时间。如何在Laravel中运行异步作业?

我想要的是将该数组拆分为多个块,并同时处理所有这些块,然后等待所有这些作业完成,然后继续进行下一个操作。

现在我要做什么:

  1. 为此工作定义main_key
  2. 将数组拆分为块
  3. 为每个块创建一个新作业,并将其分配到$ uniqueQueueName
  4. 对于每个具有运行能力的唯一队列运行工人
exec('php artisan queue:work --queue=$uniqueQueueName --once --stop-when-empty .... >> asyncWorker.log &')
  1. 开始作业处理时-它会增加缓存中main_key的值(异步)

  2. 当作业处理完成或失败并出现错误时-它会减少缓存中main_key的值,并在value == 0(处于异步状态)时从缓存中删除main_key

  3. main_key存在于缓存中等待1秒

  4. 继续...
$syncStatsKey = 'MainJobKey';

$chunks = Collection::make($items)->chunk(100);
        foreach ($chunks as $i => $chunk) {

            $queueName = $syncStatsKey.'_'.$i.'_'.now()->getTimestamp();
            dispatch(new SyncStats($chunk,$syncStatsKey))->onQueue($queueName);
            $artisanPath = base_path('artisan');
            $logPath = storage_path('logs/AsyncWorkers.log');
            $commandString = "php $artisanPath queue:work --queue=$queueName --memory=512 --sleep=0 --timeout=600 --tries=1 --once --stop-when-empty >> $logPath &";

            exec($commandString);
        }

while (\Cache::has($syncStatsKey)) {
     sleep(1)
}

为什么不使用Artisan :: call('queue:work',[$ params])?-仅在队列工作完成时返回,而不是exec('php artisan .. 。&')

为什么不将所有这些作业发送到由Horizo​​n监督的工作人员的一个默认队列中?-这种方案消耗太多资源。有时,数组会分成200个块,所有块应同时处理。为此,至少200名工作人员应监视默认队列。但是Horizo​​n不会动态创建工作程序,而是使所有工作程序始终保持运行状态。

我很清楚自己在做什么不是解决问题的正确方法。 还有其他方法可以做我想做的事吗?

0 个答案:

没有答案