要访问芹菜任务的信息,我需要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
也许有些人有个主意吗?
答案 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轮询任务状态等。
希望对大家有帮助:)