【问题标题】:Laravel Artisan command multithreading?Laravel Artisan 命令多线程?
【发布时间】:2020-02-12 11:57:23
【问题描述】:

我有一个命令,它抓取了大约 30 万个网页,而且它需要很长时间才能运行,因为它有很多网站,而且网站在我运行服务器的地方受到限制。所以既然网络爬虫的过程是

POST Website > Scrape > Collect into Array > Write to DB

除了 POST 之外的所有其他步骤都会被延迟,因为即使完成第一步也需要很长时间。所以我希望同时运行多个工人;我正在查看的选项是 AsyncOperation 和 Laravel 的 Queue Workers,但我不确定我将如何实现其中任何一个。

【问题讨论】:

标签: php laravel web-scraping


【解决方案1】:

您可能想要使用队列/工作器系统,这里有详细说明: https://laravel.com/docs/6.x/queues

其中一个可能的设置包括 Supervisor(Linux 进程监视器),它确保 php artisan queue:work 命令在后台持续运行,并在发生错误时重新启动。

然后,您可以在 Supervisor 配置中使用 /etc/supervisor/conf.d/laravel-worker.conf 文件中的 numprocs=4 定义您希望运行 4 个实例。

基本队列说明

所以基本上这完全取决于一个队列,对于 Laravel 可能是 Redis(我可以推荐这个)、Beanstalkd 或称为“jobs”的常规 database table(最后一个可能不是最好的)生产环境的解决方案)或您选择的任何其他实现。

假设您正在运行 4 名工作人员,其中一个正在运行的 queue:work 进程将在您的队列中有一个可用时立即拿起并保留一份工作。因此,队列中的多个作业可能被不同的工作人员保留。

请注意,多个进程并行运行,这意味着如果您将 3 个作业推送到队列中,则不能假设它们将按 1-2-3 的顺序处理。它们按此顺序开始,但可能不会按此顺序完成。因此,在执行任何读取或写入操作(如数据库查询)时,您必须牢记这一点。根据您的需要,您可以将进程数设置为1 以确保正确的执行顺序,但这可能会大大限制您的吞吐量。

【讨论】:

    猜你喜欢
    • 2016-02-07
    • 1970-01-01
    • 2017-01-18
    • 2020-03-17
    • 2019-04-03
    • 2019-03-13
    • 2015-08-29
    • 2017-10-08
    • 2018-12-19
    相关资源
    最近更新 更多