Как выполнить более одного фонового процесса в laravel?

Прежде всего, я знаю об очередях и теперь имею хороший опыт работы с очередями. Проблема с очередью в том, что это очередь. Я хочу выполнять несколько функций или команд вместе в фоновом режиме. Очереди сохранят вторую команду или функцию в очереди и будут выполнены, как только будет выполнена первая из них!

Например, у меня есть таблица с ~ 3 000 000 записей, и я хочу обработать их быстрее. Что я могу сделать, так это разделить их на 5 равных блоков и выполнить 5 команд, чтобы я мог использовать свой ЦП и обрабатывать данные в 5 раз быстрее.

Итак, как я могу сделать это с Laravel? Очереди не будут работать, потому что они выполняют вещи один за другим. Если ваша идея состоит в том, чтобы создать несколько 5 множественных очередей и супервизоров для выполнения, я думаю, что это не стандартный способ сделать это.

Любая идея о том, что можно сделать в этом случае?

8

Решение

Просто чтобы добавить кое-что из моего личного опыта.

Первый установить и настроить соответственно, для вашей операционной системы, ниже приведены настройки для ОС Linux на базе Linux, например, Ubuntu

Конфиденциальность: (/etc/supervisor/conf.d)

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/app/artisan queue:work database --sleep=3 --tries=3
autostart=true
autorestart=true
user=username
numprocs=25
redirect_stderr=true
stderr_events_enabled=true
stderr_logfile=/var/www/app/storage/logs/worker.error.log
stdout_logfile=/var/www/app/storage/logs/worker.log

Затем создайте работы в соответствии с вашими потребностями и отправка.

Супервизор будет обрабатывать задания одновременно, в этом конкретном случае 25 задания будут обрабатываться одновременно.

3

Другие решения

Наконец-то я нашел решение. Это очень очень легко. Итак, вот как это работает.

Прежде всего, я делю записи на количество блоков (например, 5 блоков. Это разделит 3 миллиона элементов на 5 блоков по 600 тысяч элементов в каждом)

Затем я могу отправить команду в очереди, которые я мгновенно создаю для чанков, и выполнить работника очереди для этой очереди только один раз, используя --once вариант. Чтобы было проще понять, вот код, который я использую.

$chunk_id = 0;
foreach($chunks as $chunk){
// Adding chunk to queue
Artisan::queue('process:items',[
'items' => $chunk,
])->onQueue('processChunk'.$chunk_id);

// Executing queue worker only once
exec('php artisan queue:work --queue=processChunk'.$chunk_id.' --once > storage/logs/process.log &');

$chunk_id++;
}

С exec Команда, мы выполняем работника очереди для определенной очереди, созданной для определенного чанка. Также мы добавили & в конце команды, которая заставляет команду выполняться в фоновом режиме на уровне ОС.

Вот как это можно сделать. Я проверял это, и это работает гладко! Что-то еще, чтобы улучшить или есть какие-либо недостатки использования этого метода?

3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector