Python 检查芹菜中完成的多项任务的最佳方法?

Python 检查芹菜中完成的多项任务的最佳方法?,python,celery,jobs,worker,Python,Celery,Jobs,Worker,经过一些研究,我发现更多的问题。。。 下面是更详细的示例: 上载URL列表,为所有URL设置作业id(需要动态生成队列名称以进行清除) 使用芹菜任务对每个url进行爬网,例如extract.delay(作业id,url)并保存到数据库 (可能这里有很多作业---作业1、作业2、作业3)作业中的所有任务都是相同的提取,只有一个工作人员处理所有队列(如何处理?我无法将所有队列名称告诉工作人员) 选中xxx中的db选择count(id),其中job_id=yyy等于len(url), 或者用芹菜告诉我

经过一些研究,我发现更多的问题。。。 下面是更详细的示例:

  • 上载URL列表,为所有URL设置作业id(需要动态生成队列名称以进行清除)
  • 使用芹菜任务对每个url进行爬网,例如
    extract.delay(作业id,url)
    并保存到数据库
  • (可能这里有很多作业---作业1、作业2、作业3)作业中的所有任务都是相同的
    提取
    ,只有一个工作人员处理所有队列(如何处理?我无法将所有队列名称告诉工作人员)
  • 选中xxx中的db
    选择count(id),其中job_id=yyy
    等于
    len(url)
    , 或者用芹菜告诉我工作完成了
  • 在网站中显示此作业状态(正在运行或已完成),可以清除网站上的作业队列 我从来没有遇到过这种情况,芹菜是否有一些简单的方法来解决我的问题


    我需要动态添加一个作业,一个作业包含很多任务。所有任务都是相同的。如何使不同的作业具有不同的队列名称,并且只有一个工作人员处理所有队列?我不知道您的web应用程序的详细信息,但这可能非常简单

    (使用Django语法)

    您可以制作两个模型/DB表。一个代表你的批次。一个代表每个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()
    
    因此,在webview中,您只需检查批处理的所有作业是否完成:

    def batch_done(batch):
        return not batch.scrapejob_set.filter(done=False).exists()
    
    总而言之: -保存URL的DB表 -一个DB表,用于保存类似批号的内容(与URL表有外键关系)

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

    我当前的代码和您一样,但我认为每次检查db都不是很好。这就是为什么我想知道是否有更好的方法,例如通过通知或其他方式来处理芹菜问题。您想知道完成了多少次还是全部完成了?如果你只是想让所有人都这样做,你考虑过使用一个小组吗?