Laravel: задание никогда не заканчивается и удерживает работника очереди на 100% ЦП, даже если достигнута последняя строка handle () - PullRequest
0 голосов
/ 22 мая 2019

Мое приложение имеет несколько заданий для обработки загруженных файлов CSV. Эти файлы могут быть довольно большими, поэтому они обрабатываются в очереди. Все мои работы работают хорошо, кроме одной, которая никогда не заканчивается. Это задание обычно занимает немного больше времени, чем другие, поэтому я запускаю работника очереди с php artisan queue:work --timeout=300 --sleep=3, чтобы процесс автоматически не прерывался. Работа на самом деле не занимает 5 минут, максимум около 1: 30.

Странно то, что он не застрял в каком-то бесконечном цикле или чем-то еще, последняя строка метода handle() класса Job фактически достигнута (это Log::info(), который говорит мне, что задание имеет законченный). В рабочей консоли Processed никогда не отображается, а поток закрепляется при 100% -ной загрузке ЦП. Интересно, что поток находится на уровне около 85% ЦП во время выполнения задания и фактически увеличивается до 100% после его завершения. На самом деле он не будет работать вечно, когда будет достигнут --timeout, который я указал в работнике очереди, процесс прекратится.

Задание инициируется так же, как и любое другое задание (контекстуально):

// I use repository classes in my application, which are called from Controllers.
// In this case, the processFile method inside my ImportRepository dispatches the job that
// will process the file.
public function processFile(UploadedFile $file, string $type, $delimiter = ';') : Import
{
    // Each uploadable file has it's own class which defines the columns etc. This function
    // will initiate that class for the uploaded file. It also has information on which job
    // to call etc. which is used later
    $import = $this->getImportClassForType($file, $type);

    // Model is a Eloquent model to track the status, create it
    $model = $this->create([
        'type'      => $type,
        'started_on'    => Carbon::now(),
        'status'        => 'initiated',
        'line_count'    => $file->getLineCount(),
    ]);

    // Returns the specific job to dispatch to handle this type of file.
    $import::getValidationJobClass()::dispatch($import, $model);

    return $model;
}

Фактическая задача обработки довольно проста, она имеет цикл foreach для итерации по строкам файла CSV. Я не думаю, что проблема заключается в этом, так как этот цикл foreach завершен, как и ожидалось, и достигнута последняя строка задания обработки.

Может ли это быть связано с тем, что работа обычно занимает немного больше времени, чем любая другая? Мне пришлось использовать --timeout=300, потому что процесс очереди был бы убит раньше. Я могу выполнить любое другое задание с помощью --timeout=300, и они будут завершены, хотя ... В журналах нет ошибок. Я просто вижу Log::info() из последней строки и все. Я попытался добавить return; в класс Job, но безуспешно.

Я использую последнюю версию Homestead на MacBook Pro

Любая помощь приветствуется.

...