Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 芹菜工人并发_Python_Django_Celery - Fatal编程技术网

Python 芹菜工人并发

Python 芹菜工人并发,python,django,celery,Python,Django,Celery,我做了一个刮刀来扫描大约150个链接。 每个链接都有大约5千个子链接可以从中获取信息 我正在使用芹菜在后台运行scraper,并将数据存储在Django ORM上。我使用BeautifulSoup作为废弃URL 当我使用此命令运行芹菜时 芹菜工人-A--并发性=50 一切正常,但工人们从1岁到50岁都在睡觉 如何才能让芹菜一直工作到刮刀完成它的任务?首先,该命令不会启动50个工人,而是启动1个工人和50个进程。我还建议您尽可能多地使用可用的内核。(我剩下的答案是8。) 我猜其他进程是空闲的,因为

我做了一个刮刀来扫描大约150个链接。 每个链接都有大约5千个子链接可以从中获取信息

我正在使用芹菜在后台运行scraper,并将数据存储在Django ORM上。我使用
BeautifulSoup
作为废弃URL

当我使用此命令运行芹菜时

芹菜工人-A--并发性=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

向我们展示您的任务是如何定义和启动的这意味着当您尝试将每个链接作为任务并创建工作进程并发数时,性能是否良好?只要您的并发数至少与您拥有的内核数一样高,这将是相当理想的。好的,让我试着让您知道,这意味着如果工作进程从20个并发开始,这20个进程将与每个任务一起启动?不,这意味着工人将实例化20个进程,每个进程处理一个任务。如果一个进程完成了它的任务,它将从一个新任务开始,只要还有任务。我有150个链接,它将是150个任务,20个进程就可以了