我试图找到一种方法来获取触发celery beat启动任务的时间条件。
获取datetime.now()
的时间经常偏离任务按celery beat排队的时间,因为所有celery worker都很忙碌。举例来说:我把任务设置为每天12:30执行,但由于所有工作人员都很忙碌,所以任务在12:31开始运行。
我需要知道哪个时间条件触发了任务,而不管任务执行的时间。
编辑:
我是这样定义我的周期性任务的:
CELERYBEAT_SCHEDULE = {
'periodic_clear_task': {
'task': 'app.tasks.periodic_clear_task',
'schedule': crontab(hour=2),
'args': ()
},
'periodic_update_task': {
'task': 'app.tasks.periodic_update_task',
'schedule': crontab(minute='00,30'),
'args': ()
},
}
字符串
3条答案
按热度按时间kq0g1dla1#
类似地,对于这个问题中的另一个answer,我使用了expires(秒)来解决这个问题。使用Celery Beat时间表时,可以按如下方式指定:
字符串
这里的限制很重要,因为现在我们分配了一个到期值,如果达到这个限制,任务将不会执行。因此,需要将其选择为足够大,以便根据需要处理任务。请记住,到期值以秒为单位指定。更多信息在这里。
当指定expires参数时,Celery会自动将秒值转换为内部使用的日期时间值。要访问函数中的过期时间,必须绑定该方法,然后从任务请求对象中检索。此任务对象应与下面的任务对象类似。
型
一旦你有时间,你可以做简单的计算,以重新获得触发时间。
型
inn6fuwd2#
我遇到了同样的问题,我想在周期性celery 任务中使用任务触发时间而不是执行时间。我找不到celery 任务中有任务触发时间的确切字段。作为一种方法,我已经使用了到期时间的任务。
字符串
yc0p9oo03#
after_task_publish信号可能会有所帮助。
演示代码
字符串
日志
型