检查Celery中完成的多项任务的最佳方法是什么?

时间:2015-06-23 04:58:14

标签: python celery jobs worker

经过一番研究,我发现问题更多...... 下面是更详细的Emxaple:

  1. 上传网址列表,为所有网址设置一个job_id(需要生成一个动态队列名称进行清除)。
  2. 使用Celery任务抓取每个网址,例如extract.delay(job_id, url)并保存到数据库。
  3. (也许这里有很多工作--- job1,job2,job3)作业中的所有任务都是extract,只有一个工人处理所有队列(怎么办?我不能告诉工人的所有队列名称)
  4. 检查db select count(id) in xxx where job_id = yyy等于len(urls), 或Celery告诉我job_id yyy已完成的其他方式。
  5. 在网站上显示此作业状态(运行或完成),可以清除Web上的作业队列。
  6. 我从来没有遇到过这种情况,芹菜有一些简单的方法来解决我的问题吗?

    我需要动态添加一个作业,一个作业包含很多任务。所有任务都是相同的。如何让不同的工作具有不同的队列名称,只有一个工作人员处理所有队列?以编程方式。

1 个答案:

答案 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表具有外键关系)

  • celery将任务完成后在数据库中抓取的URL标记为
  • 通过URL表进行简单搜索可以告诉您作业是否完成。您可以在网站上显示此值