在芹菜中,如何根据任务完成运行期间任务

时间:2015-07-31 18:14:54

标签: python django task celery

所以在我的django项目中,我目前有一个芹菜节拍时间表,用于定时运行的任务。

现在,我的任务是从URL请求大约250次用json响应,并且由于从该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),

 }
}

2 个答案:

答案 0 :(得分:0)

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

类似的东西:

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,或者由于其他原因,工作人员可能无法重新安排任务。

答案 1 :(得分:0)

您可以执行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)