在celerybeat中一次只运行一个任务

时间:2011-06-23 13:45:13

标签: python celery celerybeat

我有一项任务,我每分钟使用celerybeat执行一次。它工作正常。但有时,任务运行需要几秒钟,因为运行任务的两个实例。这导致一些竞争条件搞砸了。

我可以(并且可能应该)修复我的任务以正常工作但我想知道芹菜是否有任何内置方法来确保这一点。我粗略的Google搜索和RTFM没有产生任何结果。

4 个答案:

答案 0 :(得分:2)

你可以add a lock,使用像memcached或只是你的数据库。

答案 1 :(得分:1)

如果您使用cron计划或时间间隔来运行定期任务,您仍然会遇到问题。您始终可以使用数据库或缓存甚至文件系统来使用锁定机制,也可以使用前一个任务来安排下一个任务,这可能不是最好的方法。 这个问题可能对您有所帮助: django celery: how to set task to run at specific interval programmatically

答案 2 :(得分:0)

您可以尝试将类字段添加到包含您正在运行的函数的对象中,并将该字段用作“其他人正在工作或不工作”控件

答案 3 :(得分:0)

锁定是一种很好的方式,无论是节拍还是cron。

但是,请注意,击败作业在工作人员开始时间运行,而不是在节拍运行时间。

这导致我即使在锁定的情况下也会遇到竞争状态。让我们说这名工作人员已关闭并击败了10个工作岗位。当celery以4个进程启动时,所有4个进程都会获取任务,在我的情况下,1或2将同时获取并设置锁定。

解决方法之一是使用带锁的cron,因为cron将在那时执行,而不是在工作人员启动时执行。

解决方案二是使用稍微更先进的锁定机制来处理竞争条件。对于redis,请查看setnx或更新的redlock。 这篇博文非常好,包括一个使用redis-py锁定机制的装饰模式:http://loose-bits.com/2010/10/distributed-task-locking-in-celery.html