python - 在计划任务的情况下如何从芹菜中获取任务ID(节拍)
问题描述
要访问 celery 任务的信息,我需要 task_id。当手动启动 celery 任务时,我可以使用 task.id 轻松获取此任务的 id(并将其写入 DB 或执行其他操作)。如果我使用 celery-beat,它会定期向工作人员发送任务,这似乎是不可能的。
所以我的问题是,如何在 beat 将任务发送给 celery 的工人的那一刻从任务中获取 id?
在工作人员收到任务的那一刻,控制台会显示任务 ID。所以我担心的是,在任务被beat发送给工人的那一刻,它没有任务ID。
手动获取task_id的案例:
task = tasks.LongRunningTask.delay(username_from_formTargetsLaden, password_from_formTargetsLaden, url_from_formTargetsLaden)
task_id = task.id
也许你们中的一些人有想法?
解决方案
我找到了这个小问题的答案:
如果您需要最初由 beat 发送的任务的任务 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']))
定期执行的任务
这是工作人员收到beat的“提醒”后,celery将执行的计划任务。
@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 轻松轮询任务状态等。
希望对你们有帮助:)
推荐阅读
- python - Python烧瓶日志记录:两种不同的格式,但想要一种格式
- javascript - 如何在 REST 请求后不使用重定向来更新 HTML 内容?
- firebase - Firebase-Admin 更新用户的电子邮件时,如果页面刷新,用户会注销
- ios - 我可以在应用商店中为订阅价格设置具体价格吗?
- php - php - 在浏览器中显示 png/image 在 localhost 中有效,但在 aws 上无效
- python - 对已修改的照片进行正确的图像处理
- python-3.x - 如何在 pandas 数据框中分隔一个带有 2 个大写字母的字符串和一个带有正则表达式的空格?
- c++ - 我的 main() 文件中不能包含头文件
- python - 在 TPU 上使用 tf.data.Dataset 和 Keras
- typescript - 带有可选参数和剩余参数的打字稿函数重载