我做了一个刮板以扫描150个链接。每个链接都有大约5K子链接以获取信息。
我正在使用芹菜在背景中运行刮板,并将数据存储在Django Orm上。我使用 BeautifulSoup
进行废除。
我使用此命令运行芹菜
celery worker -A ... --concurrency=50
一切正常,但工人从1到50个睡眠
我如何使芹菜工作直到刮板完成任务?
首先,该命令不会启动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