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

标签 django thread-safety rabbitmq celery django-celery

在我的 Django 项目中,我正在使用 Celery 运行一些异步任务( docs ), 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

最佳答案

备查。因为我设置了CELERY_ALWAYS_EAGER,任务立即执行了设置为 True,这具有运行任务的效果 synchronously .将此变量设置为 False 解决了我的问题。

希望这可以帮助某人。

关于Django Celery - 如何启动延迟 n - 秒的任务 - 倒计时标志被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16498966/

相关文章:

python - 在 Django 模板中声明变量和 if 语句

python - 启用 WhiteNoise 时,“collectstatic”命令失败

multithreading - 线程是否有任何实用的替代方案?

rabbitmq - 使用 spring-amqp 和 rabbitmq 实现带退避的非阻塞重试

docker - 启动预构建的Docker镜像后运行命令的最佳实践

c# - HelloWorld 示例,用于在两个不同的应用程序之间通过 EasyNetQ 通过 RabbitMQ 发送对象

jquery - Django "Similar Objects"基于相似标签集

python - Django user.save() 在列 'is_superuser' 上失败不能为空

asp.net-mvc-3 - AutoMapper 线程问题(缺少类型映射配置或不受支持的映射)?

java - 使用 ReentrantLock 避免死锁