[英]How can I capture all of the python log records generated during the execution of a series of Celery tasks?
[英]How can I defer the execution of Celery tasks?
我有一个小脚本,可以将任务排入队列以进行处理。 此脚本进行大量数据库查询以获取应入队的项目。 我面临的问题是 celery 工作人员在脚本排队后立即开始接收任务。 这是正确的,也是 celery 应该工作的方式,但这通常会导致我的脚本和 celery 工作人员之间出现僵局。
有没有办法可以将脚本中的所有任务排入队列,但将执行延迟到脚本完成或固定时间延迟?
我在 celery 或 django-celery 的文档中找不到这个。 这可能吗?
目前作为一个快速修复,我想将所有要处理的项目添加到列表中,当我的脚本执行完所有查询时,我可以简单地遍历列表并将任务排入队列。 也许这可以解决问题,但是当您有数千个项目要排队时,这可能是一个坏主意。
eta/countdown 选项可以延迟任务执行:
http://docs.celeryproject.org/en/master/userguide/calling.html#eta-and-countdown
我认为您正在尝试避免自己脚本的竞争条件,而不是要求延迟任务运行的方法。
然后您可以创建一个任务,并在该任务中使用 .apply() 而不是 .apply_async() 或 .delay() 调用您的每个任务。 以便这些任务依次运行
要定义任务执行的延迟,请使用apply_async()
和以下格式的倒计时选项:
from datetime import timedelta
#Delay for 10 seconds
T.apply_async(args=[arg1, arg2], countdown = 10)
#Delay for 10 days
T.apply_async(args=[arg1, arg2], countdown = timedelta(days=10))
通过使用timedelta
,可以为任务执行定义更复杂的延迟。 请注意, delay()
是另一个调用 API,但不支持延迟倒计时。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.