Celery worker并发性。

3
我已经制作了一个爬虫来扫描大约150个链接。每个链接有大约5k个子链接来获取信息。
我使用Celery在后台运行爬虫并将数据存储在Django ORM中。我使用BeautifulSoup来抓取URL。
当我使用以下命令运行celery时:
celery worker -A ... --concurrency=50
一切都正常工作,但是1到50个工作进程处于睡眠状态。
我该如何让Celery一直工作,直到爬虫完成任务?

展示您如何定义和触发任务。 - georgexsh
1个回答

4
首先,使用该命令将不会启动50个工作进程,而是1个拥有50个子进程的工作进程。我建议您只使用可用内核数量的进程(假设在我的回答中为8)。
我猜测其他进程处于空闲状态,因为您只执行了一个任务。如果要执行并发工作,您需要将工作分成可以同时执行的部分。最简单的方法是为要爬取的每个链接创建一个单独的任务。工作进程将开始处理8个链接,当处理完其中一个后,将继续处理下一个链接,直到完成所有150个链接的爬取。
因此,您任务的调用代码应大致如下:
for link in links:
    scrape_link.delay(link)

使用scrape_link,您的任务函数可能如下所示:
@app.task
def scrape_link(link):
    #scrape the link and its sub-links

这意味着当您尝试将每个链接作为任务并设置工作程序并发数时,会获得良好的性能。 - Ahmed Elemam
不,这意味着工作进程将实例化20个进程,每个进程处理一个任务。如果进程完成了它的任务,它将开始处理新任务,只要还有剩余的任务。 - Glenn D.J.
但是为什么我从20开始,它会减少到1然后消失? - Ahmed Elemam
你看到了什么在减少呢?任务没有执行吗?你使用了哪些监控工具?尝试一些简单的方法,比如在任务开始时加上 print("task starting"),这样你就可以看到任务何时开始了。 - Glenn D.J.
嗨,这就是我所说的网络爬虫停止运行并出现在这张图片中的意思。https://drive.google.com/file/d/1-BRgV7pEHMrPOFZYunj19qlAen08lbiQ/view?usp=sharing - Ahmed Elemam
显示剩余7条评论

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