【问题标题】:In celery, how do i run a period task based on task completion在芹菜中,我如何根据任务完成运行周期任务
【发布时间】:2015-10-23 12:17:33
【问题描述】:

所以在我的 django 项目中,我目前有一个 celery beat 时间表,用于在计时器上定期运行的任务。

现在,我的任务是从一个以 json 响应的 URL 请求大约 250 次,并且由于从该 URL 请求是有限的,整个任务可能需要 5 分钟到 10 分钟,具体取决于请求的成功程度。

不是通过计时器定期运行此任务,而是如何根据上次任务完成来运行它。

例如:如果最后一个任务在 10 秒前完成,则再次运行此任务

tasks.py

@app.task()
def run_db():
allPlayers = Player.objects.all()
for player in allPlayers:
    a = get_json(player.name)
    if a is None:
        pass
    else:
        player.mmr = a['rnk_amm_team_rating']
        player.save()
        print player.mmr 
        time.sleep(2)

settings.py

CELERYBEAT_SCHEDULE = {
 'add-every-10-seconds': {
    'task': 'ladder.tasks.run_db',
    'schedule': timedelta(seconds=10),

 }
}

【问题讨论】:

    标签: python django task celery


    【解决方案1】:

    您可以创建一个迭代 250 次的单个任务,而不是调用该任务 250 次,因为您希望在完成上一个任务后开始您的下一个任务,您不需要异步调用所有任务。这是我的建议:

    @app.task()
    def run_db():
        allPlayers = Player.objects.all()
        for run in totalRuns:  #(totalRuns = 250 in your case.)
            for player in allPlayers:
                a = get_json(player.name)
                if a is None:
                    pass
                else:
                    player.mmr = a['rnk_amm_team_rating']
                    player.save()
                    print player.mmr 
                    time.sleep(2)
            time.sleep(10)
    

    【讨论】:

      【解决方案2】:

      我认为实现这一点的唯一方法是在当前任务执行结束时再次调用该任务。

      类似:

      def rundb():
          allPlayers = Player.objects.all()
          for player in allPlayers:
              a = get_json(player.name)
              if a is None:
                  pass
              else:
                  player.mmr = a['rnk_amm_team_rating']
                  player.save()
                  print player.mmr
                  time.sleep(2)
      
          rundb.apply_async(countdown=10)  # Call the same task again in 10 seconds
      

      请记住,这应该受到监控。如果工作人员崩溃并且您没有使用 ack_late,或者由于其他原因,工作人员可能无法重新安排任务。

      【讨论】:

        猜你喜欢
        • 2015-04-11
        • 2018-03-11
        • 2016-08-18
        • 2014-10-28
        • 2020-05-19
        • 2019-02-26
        • 2020-07-09
        • 2018-04-05
        • 1970-01-01
        相关资源
        最近更新 更多