【发布时间】:2018-04-13 10:32:12
【问题描述】:
我有一个 Celery 任务,例如:
from celery.task import task
from django.conf import settings
from base.tasks import BaseTask
@task(name="throw_exception", base=BaseTask)
def print_value(*args, **kwargs):
print('BROKER_URL:', settings.BROKER_URL)
我正在我的 virtualenv 中运行一个 Celery worker,例如:
celery worker -A myproject -l info
工人展示:
Connected to amqp://guest:**@127.0.0.1:5672/myapp
当我从 Django shell 启动我的任务时:
>>> from django.conf import settings
>>> settings.BROKER_URL
'amqp://guest:**@127.0.0.1:5672/myapp'
>>> from myapp.tasks import print_value
>>> print_value.delay()
我从未在工作人员的日志中看到执行的任务。
但是,如果我改为使用带有默认“/”虚拟主机的 BROKER_URL,那么它会立即执行所有待处理的任务,这意味着我对 print_value.delay() 的所有调用都将其发送到错误的虚拟主机,即使设置了正确的 BROKER_URL。我做错了什么?
编辑:问题似乎是 Celery 没有一致的 @task 装饰器,并且通过使用错误的装饰器,您将任务与代理设置断开连接。所以本质上,我的所有任务都配置为使用默认代理,而不是我的设置中定义的代理。旧文档说要使用from celery.task import task,但新文档...并没有真正指定,似乎暗示您应该使用celery.py 文件中定义的app 实例,例如@app.task。问题是我所有的任务都在单独的tasks.py 文件中,他们无法访问app 实例。如果我将一个任务复制到我的celery.py 并使用@app.task 装饰器,那么它会使用正确的虚拟主机并按预期工作,但很明显,这不是一个实际的解决方案,因为我必须复制几十个函数到这个文件中。如何正确解决此问题?
【问题讨论】:
-
通过
sudo rabbitmqctl add_vhost {vhost_name}添加虚拟主机并通过sudo rabbitmqctl set_permissions -p {vhost_name} {username} ".*" ".*" ".*"将用户权限设置为虚拟主机? -
@Ykh,是的,这不是 rabbitmq 的问题。
-
你可以尝试在
views.py中通过请求方法调用任务,而不是在python shell中,不确定python shell是否使用与你的virtualenv相同的环境。