我在 Ubuntu EC2 节点上有一个 Django 项目,我一直在使用它来设置异步使用Celery
。
我已经能够在命令行上完成一项基本任务,使用方法如下:
(env1)ubuntu@ip-172-31-22-65:~/projects/tp$ celery --app=myproject.celery:app worker --loglevel=INFO
但是,如果我运行如下所示的其他 celery 命令,则会得到以下结果:
(env1)ubuntu@ip-172-31-22-65:~/projects/tp$ celery 工作者
Cannot connect to amqp://guest:**@127.0.0.1:5672//: [Errno 111] Connection refused.
看起来 celery 认为我使用 amqp 作为代理,但我使用 redis!!我一直在尝试关注http://michal.karzynski.pl/blog/2014/05/18/setting-up-an-asynchronous-task-queue-for-django-using-celery-redis/
已安装的python包:
(env1)ubuntu@ip-172-31-22-65:~/projects/tp$ pip freeze
amqp==1.4.6
anyjson==0.3.3
billiard==3.3.0.19
celery==3.1.17
Django==1.7.7
django-redis-cache==0.13.0
kombu==3.0.24
pytz==2015.2
redis==2.10.3
requests==2.6.0
uWSGI==2.0.10
/项目/tp/tp/celery.py
from __future__ import absolute_import
import os
import django
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', 'tp.settings')
django.setup()
app = Celery('hello_django')
# 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)
另外,在redis.conf中:
# Specify the path for the unix socket that will be used to listen for
# incoming connections. There is no default, so Redis will not listen
# on a unix socket when not specified.
#
unixsocket /var/run/redis/redis.sock
unixsocketperm 777
tp.settings.py:
# CELERY SETTINGS
BROKER_URL = 'redis://localhost:6379/0'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CACHES = {
'default': {
'BACKEND': 'redis_cache.RedisCache',
'LOCATION': '/var/run/redis/redis.sock',
},
}
我怎样才能让它使用 Redis 作为代理?
答案1
执行“celery worker”时应添加-A
选项,以便 celery 连接到您在配置中的代理。否则 celery 将尝试连接默认代理。