Как запустить ограниченное количество фоновых процессов из заданий laravel? - PullRequest
1 голос
/ 12 июня 2019

Я хочу запускать процессы ffmpeg из заданий laravel, но не слишком много сразу.Я просто не могу понять это правильно.Независимо от того, что я установил для $ process_limit - он запускается только по одному, и между ними есть большие задержки.Возможно, я использую public $ timeout неправильно.Возможно retryUntil ().Я не знаю.

<?php

namespace FuquIo\LaravelFfmpeg;

use Cocur\BackgroundProcess\BackgroundProcess;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redis;

class RenderMpeg4ToWebmJob implements ShouldQueue{
use Dispatchable, InteractsWithQueue, Queueable;

public $timeout = 3600;

/**
 * @var string
 */
private $input_file;
/**
 * @var array
 */
private $map;

/**
 * Create a new job instance.
 *
 * @param array  $map
 * @param string $input_file
 */
public function __construct(array $map, string $input_file){
    //
    $this->map        = $map;
    $this->input_file = $input_file;
}

/**
 * Execute the job.
 *
 * @return void
 * @throws \Exception
 */
public function handle(){

    $almost_timeout = $this->timeout - 100;
    $map            = $this->map;
    $input_file     = $this->input_file;

    $cmds = '(' . implode('; ', config('fuqu-ffmpeg.command')) . ')';
    $cmds = str_replace(array_keys($map), array_values($map), $cmds);

    Log::debug($cmds);

    $process_limit = config(ServiceProvider::SHORT_NAME .'.process_limit');
    Redis::funnel('ffmpeg')->limit($process_limit)->then(
        function () use ($cmds, $input_file, $almost_timeout){

            $process = new BackgroundProcess($cmds);
            $process->run();

            if(!$process->isRunning()){
                throw new \Exception('Unable to execute file processing command on ' . $input_file);
            }

            /**
             * This doesn't prevent an additional
             * background process from spawning
             * but it does give a head start
             */
            $slept = 0;
            do{
                sleep(10);
                $slept += 10;
            }while($process->isRunning() and ($slept < $almost_timeout));

        }, function (){
        // Could not obtain lock...

        return $this->release(100);
    });


}

/**
 * Rather than doing x tries,
 * just keep trying until.
 *
 * @return \DateTime
 */
public function retryUntil(){
    return now()->addDays(1);
}

}

1 Ответ

0 голосов
/ 13 июня 2019

Оказалось, код в вопросе действительно работает. Моя проблема как внутри процесса bg. У него были проблемы с файлами, которые заканчивались рядом. Я оставлю код, я думаю ... может быть полезным для кого-то.

...