首先,我了解队列并且现在对队列有很好的体验。队列的问题是,它是一个队列。我想在后台同时执行多个功能或命令。队列会将第二个命令或函数保留在队列中,并在第一个完成执行后执行!
例如,我有一个包含约 3,000,000 条记录的表,我想更快地处理它们。我能做的是将它们分成 5 个相等的 block 并总共执行 5 个命令,这样我就可以利用我的 CPU 以及处理数据的速度提高 5 倍。
那么,我如何使用 Laravel 做到这一点?队列不会工作,因为它们一个接一个地执行任务。如果您的想法是创建多个 5 多个队列和主管来完成,我认为这不是标准的方法。
关于在这种情况下可以做什么的任何想法?
最佳答案
最后,我找到了解决办法。这非常非常容易。所以,这是它的工作原理。
首先,我把记录分成chunk的个数(比如5个chunk,它会把300万个item分成5个chunk,每个chunk有600k个item)
然后,我可以将命令推送到我为 block 即时创建的队列,并使用 --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
命令,我们正在为特定 block 创建的特定队列执行队列工作程序。此外,我们在命令末尾添加了 &
,强制命令在操作系统级别的后台执行。
这是可以做到的。我测试了它,它工作顺利!还有什么需要改进的地方,或者使用这种方法有什么缺点吗?
关于php - laravel如何执行多个后台进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48987559/