Python django中的异步芹菜任务调用未被推入rabbitmq队列
我在django版本1.4.1的系统中安装了芹菜==3.0.12和DJ芹菜==3.0.11。我试图在我的一个项目中使用芹菜异步处理一些任务,但它不起作用。为了进行测试,我启动了一个新的django项目,定义了示例任务add,并从shell中调用它,如下所示Python django中的异步芹菜任务调用未被推入rabbitmq队列,python,django,rabbitmq,celery,Python,Django,Rabbitmq,Celery,我在django版本1.4.1的系统中安装了芹菜==3.0.12和DJ芹菜==3.0.11。我试图在我的一个项目中使用芹菜异步处理一些任务,但它不起作用。为了进行测试,我启动了一个新的django项目,定义了示例任务add,并从shell中调用它,如下所示 >>>res = add.delay(3, 5) 我尝试了res.status、res.get和res.ready,所有这些都被阻止了。我使用rabbitmq管理插件在浏览器中监视rabbitmq芹菜队列。芹菜队列处于空
>>>res = add.delay(3, 5)
我尝试了res.status、res.get和res.ready,所有这些都被阻止了。我使用rabbitmq管理插件在浏览器中监视rabbitmq芹菜队列。芹菜队列处于空闲状态,没有收到任何消息
下面是目录树
|-- manage.py
|-- new_app
| |-- __init__.py
| |-- __init__.pyc
| |-- models.py
| |-- models.pyc
| |-- tasks.py
| |-- tasks.pyc
| |-- tests.py
| `-- views.py
`-- testapp
|-- __init__.py
|-- __init__.pyc
|-- settings.py
|-- settings.pyc
|-- urls.py
`-- wsgi.py
以下是文件的内容
新建应用程序/tasks.py
from celery import task
@task
def add(x ,y):
return x + y
testapp/settings.py
import djcelery
djcelery.setup_loader()
BROKER_URL = 'amqp://'
CELERY_RESULT_BACKEND = 'amqp://'
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
BROKER_HOST = 'localhost'
BROKER_PORT = 5672
BROKER_USER = 'guest'
BROKER_PASSWORD = 'guest'
BROKER_VHOST = '/'
当我运行python manage.py celeryd-l INFO时,它正在创建芹菜队列。
以下是控制台输出。
RabbitMQ版本为3.0.0
rabbitmqctl列表队列的输出
尝试将您的操作与以下内容进行比较,找出您的应用程序中缺少的内容: 配置兔子: 在我们的例子中,首先安装它:
sudo apt-get update
sudo apt-get install rabbitmq-server
sudo mkdir /etc/rabbitmq/rabbitmq.conf.d
设置用户/psw/vhost:
sudo rabbitmqctl delete_user guest
sudo rabbitmqctl add_user <username> <password>
sudo rabbitmqctl set_user_tags <username> administrator
sudo rabbitmqctl add_vhost <some_name_for_vhost>
sudo rabbitmqctl set_permissions -p <some_name_for_vhost> <username> ".*" ".*" ".*"')
定义任务:
tasks.py
管理工人:
很好地杀死所有现有的,运行10个名为app_-worker的worker,将它们连接到您的任务队列:my_-queue
run_workers.sh
定义一些测试:
test.py
您可以运行rabbitmqctl list|U队列来查看队列和消息是否在Rabbit中实际创建吗?使用它的输出更新了问题。可能是您有一个旧的工作进程正在运行,请尝试ps auxww | grep celeryd | awk{print$2}| xargs kill-9。您可以查看是否有任何使用者在使用rabbitmqctl list_队列名称消息使用者的队列中消费。如果您已经有了代理URL,那么这些代理设置也是不必要的。
sudo rabbitmqctl delete_user guest
sudo rabbitmqctl add_user <username> <password>
sudo rabbitmqctl set_user_tags <username> administrator
sudo rabbitmqctl add_vhost <some_name_for_vhost>
sudo rabbitmqctl set_permissions -p <some_name_for_vhost> <username> ".*" ".*" ".*"')
RABBIT_USERNAME = <username>
RABBIT_PASSWORD = <password>
RABBIT_HOST = 'localhost' #or some server dns/ip
RABBIT_VHOST = <some_name_for_vhost>
BROKER_URL = 'amqp://%s:%s@%s:5672/%s' % (RABBIT_USERNAME,RABBIT_PASSWORD,RABBIT_HOST,RABBIT_VHOST)
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_TIMEZONE = 'UTC'
CELERY_ENABLE_UTC = True
CELERY_CREATE_MISSING_QUEUES = True
from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'yourapp.settings')
app = Celery('yourapp')
# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
from celery import task
@task(queue="my_queue")
def do_something_in_background(x1,x2):
#start doing something in the task
#enter you code in here
#!/bin/bash
ps auxww | grep 'yourapp worker' | awk '{print $2}' | xargs kill
celery -A yourapp worker -Q my_queue -n app_worker -l info -c 10 -Ofair
import tasks
def my_func():
tasks.do_something_in_background.delay(x1,x2)