Tho*_*mel 3 django thread-safety rabbitmq celery django-celery
在我的Django项目中,我使用Celery(docs),Django-Celery和RabbitMQ作为代理运行一些异步任务.虽然它一般工作,我的设置有两个问题:
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)
Run Code Online (Sandbox Code Playgroud)
从控制台中运行此任务会给我以下结果:
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
Run Code Online (Sandbox Code Playgroud)
因此,完全忽略设置为10的倒计时标志.知道我的设置有什么问题吗?
我用以下命令启动Celery和RabbitMQ:
RABBITMQ_NODE_PORT=5672 rabbitmq-server
python manage.py celeryd --loglevel=info
Run Code Online (Sandbox Code Playgroud)
更新:
我认为这个问题在某种程度上与时区设置有关.有关详细信息,请参阅此主题.无论如何不确定如何规避它.我执行了这些测试,总是得到相同的结果,结果立即可用:
>>> 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6236 次 |
| 最近记录: |