如果计划任务(节拍),如何从芹菜中获取任务ID

时间:2019-06-27 07:06:48

标签: python rabbitmq celery celerybeat

要访问芹菜任务的信息,我需要task_id。手动启动celery任务时,我可以通过task.id轻松获取此任务的ID(并将其写入数据库或执行其他操作)。 如果我使用celery-beat,它会定期向工作人员发送任务,那似乎是不可能的。

所以我的问题是,在节拍将任务发送给芹菜的工人的那一刻,如何从任务中获取ID?

工作人员收到任务后,控制台将显示任务ID。所以我担心的是,当任务被殴打发送给工作人员时,它没有任务ID。

获取task_id的案例:

task = tasks.LongRunningTask.delay(username_from_formTargetsLaden, password_from_formTargetsLaden, url_from_formTargetsLaden)

task_id = task.id

也许有些人有个主意吗?

1 个答案:

答案 0 :(得分:0)

我找到了这个小问题的答案:

如果您需要节拍最初发送的任务的任务ID,则只需在(预定的)工人任务中添加检查功能。

配置定期任务

这是每天早上11:08(UTC)“提醒”芹菜开始任务的时间表。

@celery.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    test = sender.add_periodic_task(crontab(minute=8, hour=11), CheckLists.s(app.config['USR'], app.config['PWD']))

要定期执行的任务

这是排定的任务,将在工人收到节拍的“提醒”后​​由芹菜执行。

@celery.task(bind=True)
def CheckLists(self, arg1, arg2):
    #get task_id von scheduled Task 'Check-List'
    i = inspect()
    activetasks = i.active()
    list_of_tasks = {'activetasks': activetasks}
    task_id = list_of_tasks['activetasks']['celery@DESKTOP-XXXXX'][0]['id']   #adapt this section depending on environment (local, webserver, etc...)
    task_type = "CHECK_LISTS"
    task_id_to_db = Tasks(task_id, task_type)
    db.session.add(task_id_to_db)
    db.session.commit()

    long_runnning_task 
    [...more task relevant code here...] 

因此,我利用了app.control.inspect,使您可以检查正在运行的工作程序。它在引擎盖下使用远程控制命令。 使用i.active(),您将获得一个字典,可以轻松地对其进行解析。

只要找不到任何文档,如何更轻松地从定期任务中获取task_id,我就会坚持使用该解决方案。

保存任务ID后,您可以轻松地例如通过AJAX轮询任务状态等。

希望对大家有帮助:)