Django Celery - 如何以n秒的延迟启动任务 - 忽略倒计时标志

时间:2013-05-11 15:49:58

标签: django thread-safety rabbitmq celery django-celery

在我的Django项目中,我使用Celerydocs),Django-CeleryRabbitMQ作为代理运行一些异步任务。虽然它一般有用,但我的设置有两个问题:

a)任务执行似乎与我的请求线程相关联。因此,用户http请求似乎要等到任务执行完毕

b)任务执行似乎忽略了倒计时标志

出于测试目的,我设置了一个简单的TestTask:

from celery.task import Task
from celery.registry import tasks

#in project_management.tasks.py
class TestTask(Task):
    def run(self, x, y):
        print "running TestTask"
        return x + y

tasks.register(TestTask)

在控制台中运行此任务会给我以下结果:

python manage.py shell
from project_management.tasks import TestTask
result = TestTask.apply_async(args=[5, 5], kwargs={}, countdown=10)#immediately outputs "running TestTask"
result.result -> immediately returns 10
result.ready() -> immediately returns True

因此完全忽略设置为10的倒计时标志。知道我的设置有什么问题吗?

我使用以下命令启动Celery和RabbitMQ:

RABBITMQ_NODE_PORT=5672 rabbitmq-server
python manage.py celeryd --loglevel=info

更新

我认为这个问题与时区设置有某种关系。有关详细信息,请参阅此thread。无论如何不确定如何规避它。我执行了这些测试,总是得到相同的结果,结果立即可用:

>>> from project_management.tasks import add
>>> from datetime import timedelta, datetime
>>> eta = datetime.now() + timedelta(seconds=60)
>>> result = add.apply_async(args=[5, 5], kwargs={}, eta=eta)
>>> result.ready()
True
>>> eta = datetime.utcnow() + timedelta(seconds=60)
>>> result = add.apply_async(args=[5, 5], kwargs={}, eta=eta)
>>> result.ready()
True

1 个答案:

答案 0 :(得分:11)

供将来参考。该任务已立即执行,因为我已将CELERY_ALWAYS_EAGER设置为True,这样就可以运行任务synchronously。将此变量设置为False解决了我的问题。

希望这有助于某人。