我已经做了一个刮刀扫描约150个链接。每个链接有约5k子链接获得信息。我使用Celery在后台运行scraper并在Django ORM上存储数据。我使用BeautifulSoup作为scrapURL。当我用这个命令运行celery 时celery worker -A ... --concurrency=50一切都很好,但工人从1到50睡觉我怎样才能让celery 一直工作到刮刀完成它的任务呢?
BeautifulSoup
celery worker -A ... --concurrency=50
2o7dmzc51#
首先,该命令不会启动50个工作进程,而是启动1个工作进程和50个进程。我还建议使用与可用内核数量相同的进程。(在我的回答的其余部分中,假设使用8个进程。)我的猜测是因为您只执行一个任务,所以其他进程都处于空闲状态。如果您想执行并发工作,你必须把你的工作分成可以同时执行的部分。最简单的方法就是为你想抓取的每个链接创建一个单独的任务。然后,工人将开始刮擦8个链接,当完成1个链接时,将开始刮擦下一个链接,直到刮擦完所有150个链接。因此任务的调用代码应该大致如下所示:
for link in links: scrape_link.delay(link)
使用scrape_link,您任务函数看起来如下所示:
@app.task def scrape_link(link): #scrape the link and its sub-links
omvjsjqw2#
我知道这是一段时间以来,这是张贴,但如果有人正在研究这一点,你可以使用Flower来监测celery 任务。
2条答案
按热度按时间2o7dmzc51#
首先,该命令不会启动50个工作进程,而是启动1个工作进程和50个进程。我还建议使用与可用内核数量相同的进程。(在我的回答的其余部分中,假设使用8个进程。)
我的猜测是因为您只执行一个任务,所以其他进程都处于空闲状态。如果您想执行并发工作,你必须把你的工作分成可以同时执行的部分。最简单的方法就是为你想抓取的每个链接创建一个单独的任务。然后,工人将开始刮擦8个链接,当完成1个链接时,将开始刮擦下一个链接,直到刮擦完所有150个链接。
因此任务的调用代码应该大致如下所示:
使用scrape_link,您任务函数看起来如下所示:
omvjsjqw2#
我知道这是一段时间以来,这是张贴,但如果有人正在研究这一点,你可以使用Flower来监测celery 任务。