带有芹菜的Django:计划任务(ETA)并行执行多次

Posted

技术标签:

【中文标题】带有芹菜的Django:计划任务(ETA)并行执行多次【英文标题】:Django with celery: scheduled task (ETA) executed multiple times in parallel 【发布时间】:2013-02-11 02:49:33 【问题描述】:

我正在使用 Django 开发一个 Web 应用程序,它使用 Celery 来处理异步任务,尤其是对于事务性电子邮件。

我的电子邮件任务中的一个是使用 ETA 选项安排的,但它并行执行多次,导致邮件链,非常烦人。我无法弄清楚为什么。 我检查了两次我的 Django 代码,我确定它只发布了一次。

我使用 Redis 作为代理/后端结果。

我的 Celery 守护进程托管在 Heroku 上并通过以下命令启动:

python manage.py celeryd -E -B --loglevel=INFO

感谢您的帮助。

编辑:感谢#celery IRC 频道上的一个人,我在这里找到了一个有效的解决方案:http://loose-bits.com/2010/10/distributed-task-locking-in-celery.html

【问题讨论】:

请务必阅读:docs.celeryproject.org/en/latest/getting-started/brokers/… 问题是我不知道我的应用程序中的最大 ETA。我总是尽快发布它们,即使在很远的将来(不会经常发生)。为此,我应该更改我的应用程序设计,将其存储在数据库中并让爬虫在 1 小时前发布它们例子.. 【参考方案1】:

您查看过Ensuring a task is only executed one at a time 文档吗?

【讨论】:

感谢您的回答。我在这里检查一个类似的解决方案:loose-bits.com/2010/10/distributed-task-locking-in-celery.html利用 Redis。它似乎工作得很好,我对其进行了一些定制,因为我需要阻止其他相同类型和具有相同上下文的任务。我将与任务函数名称连接的任务参数散列为锁定键。我还必须从 functools 添加 wraps 装饰器,因为我使用的是基于函数的任务。

以上是关于带有芹菜的Django:计划任务(ETA)并行执行多次的主要内容,如果未能解决你的问题,请参考以下文章

芹菜任务不会在 django 中执行

如何在任务中获取芹菜结果模型(使用 django-celery-results)

Django 学习之Celery(芹菜)

芹菜节拍不接周期性任务

Django实现异步定时任务

芹菜:启动时启动任务