经过一番研究,我发现问题更多...... 下面是更详细的Emxaple:
extract.delay(job_id, url)
并保存到数据库。 extract
,只有一个工人处理所有队列(怎么办?我不能告诉工人的所有队列名称)select count(id) in xxx where job_id = yyy
等于len(urls)
,
或Celery告诉我job_id yyy
已完成的其他方式。我从来没有遇到过这种情况,芹菜有一些简单的方法来解决我的问题吗?
我需要动态添加一个作业,一个作业包含很多任务。所有任务都是相同的。如何让不同的工作具有不同的队列名称,只有一个工作人员处理所有队列?以编程方式。
答案 0 :(得分:0)
我不知道您的网络应用的详细信息,但这可能非常简单。
(使用Django语法)
你可以制作两个模型/数据库表。一个代表您的批次。一个代表每个URL作业
class ScrapeBatch(models.Model):
id = models.IntegerField()
class ScrapeJob(models.Model):
batch = models.ForeignKey(ScrapeBatch)
url = models.CharField(max_length=100) # for example
done = models.BooleanField(default=False)
然后,当您运行芹菜任务时,请使用ScrapeJob
模型作为参考
def scrape_url_celery_task(job_id):
job = ScrapeJob.objects.get(id=job_id)
scrape_url(job)
job.done=True
job.save()
因此,在您的网页浏览中,您只需检查所有批处理作业是否完成:
def batch_done(batch):
return not batch.scrapejob_set.filter(done=False).exists()
总结如下: - 包含URL的DB表 - 一个DB表,用于保存类似批号的内容(与URL表具有外键关系)