Laravel:任务调度[并行执行]

7

我有多个任务需要每小时或两小时完成。所有这些任务都已经通过 Laravel 使用以下命令作为 cron 作业进行了调度。

$schedule->command('email:notifications1')
            ->cron('15 * * * * *');
$schedule->command('email:notifications2')
            ->cron('15 * * * * *');
$schedule->command('email:notifications3')
            ->cron('15 * * * * *');

问题: 以上所有任务都非常耗时,结果表明这些任务并未并行运行。每个任务在前一个任务结束后才开始执行。

要求: 如何使它们并行运行?我希望所有任务在时钟滴答指定的时间后立即(并行)执行。

Laravel 5 版本

2个回答

11

如果您在链中添加 runInBackground()(在 Laravel 5.2 中引入),则可以轻松地运行多个并行命令。

像这样:

$schedule->command('email:notifications1')
            ->cron('15 * * * * *')->runInBackground();
$schedule->command('email:notifications2')
            ->cron('15 * * * * *')->runInBackground();
$schedule->command('email:notifications3')
            ->cron('15 * * * * *')->runInBackground();

这将在后台创建一个新进程,因此调度程序无需等待命令执行。这甚至不会干扰withoutOverlapping()方法,因为它与互斥文件一起工作。

现在,您还可以将命令保存到版本控制中。


这很棒,但在 Laravel 5 版本上不可用。 - Paranoid Android
@Paranoid Android 这是从 Laravel 5.2 开始引入的。当我回答这个问题的时候,5.1 的生命周期已经过期了很久。因此,我可以假设每个阅读这个答案的人都至少在使用 5.2。目前你不应该使用 5.1 或更低版本,因为那会带来安全风险。 - Ogier Schelvis

8

Laravel调度器由于PHP的限制一次只能运行一个命令。

但是,您可以直接在crontab文件中添加cronjobs。这样,它们将在单独的进程中并行执行。

15 * * * * * php /path/to/artisan email:notifications1
15 * * * * * php /path/to/artisan email:notifications2
15 * * * * * php /path/to/artisan email:notifications3


另一种解决方法是让作业在其他时间启动。因为 cron 作业每分钟启动一个新的 php 进程,所以它们互不影响。

例如:

$schedule->command('email:notifications1')
            ->cron('5 * * * * *');
$schedule->command('email:notifications2')
            ->cron('10 * * * * *');
$schedule->command('email:notifications3')
            ->cron('15 * * * * *');

第一种选项对我的情况很有效。第二个选项不像预期的那样工作。感谢您的帮助。 - Knight
2
第一个选项剥夺了您控制日程版本和代码版本的能力。 - Finesse
1
如果你让命令在后台运行,Laravel可以同时运行多个命令。 - Ogier Schelvis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接