python Celery工作线程并发

mgdq6dx1  于 2022-12-02  发布在  Python
关注(0)|答案(2)|浏览(204)

我已经做了一个刮刀扫描约150个链接。每个链接有约5k子链接获得信息。
我使用Celery在后台运行scraper并在Django ORM上存储数据。我使用BeautifulSoup作为scrapURL。
当我用这个命令运行celery 时
celery worker -A ... --concurrency=50
一切都很好,但工人从1到50睡觉
我怎样才能让celery 一直工作到刮刀完成它的任务呢?

2o7dmzc5

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
omvjsjqw

omvjsjqw2#

我知道这是一段时间以来,这是张贴,但如果有人正在研究这一点,你可以使用Flower来监测celery 任务。

相关问题