我正在运行Redis,Celery 4.0和Django 1.10但在运行任务时遇到[Errrno 61]连接被拒绝错误' test'来自shell。这是我的项目结构:
myproj
│
├── app1
├── __init__.py
├── tasks.py
myproj
├── __init__.py
├── urls.py
├── settings
│ ├── __init__.py
│ ├── base.py
│ ├── local.py
├── local
│ ├── __init__.py
│ ├── celery.py
│ ├── wsgi.py
的Myproj / APP1 / tasks.py:
from __future__ import absolute_import
from celery import task
@task(name='app1.tasks.test')
def test():
print('this is a test')
的Myproj /的Myproj /本地/ celery.py:
from __future__ import absolute_import
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproj.settings.local')
app = Celery('myproj_local')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks()
的Myproj /的Myproj /本地/ __init__.py
:
from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app
__all__ = ['celery_app']
我认为这个init文件有问题,因为当我将内容移动到myproj / myproj / __init__.py
时,任务从shell运行:
from __future__ import absolute_import, unicode_literals
from .local.celery import app as celery_app
__all__ = ['celery_app']
Celery在myproj目录中运行命令:
celery -A myproj.local.celery worker -l info
完整错误:
python manage.py shell --settings=myproj.settings.local
(InteractiveConsole)
>>> from app1.tasks import test
>>> test.delay()
Traceback (most recent call last):
File "<console>", line 1, in <module>
File env/lib/python2.7/site-packages/celery/app/task.py", line 413, in delay
return self.apply_async(args, kwargs)
File env/lib/python2.7/site-packages/celery/app/task.py", line 536, in apply_async
**options
File env/lib/python2.7/site-packages/celery/app/base.py", line 717, in send_task
amqp.send_task_message(P, name, message, **options)
File env/lib/python2.7/site-packages/celery/app/amqp.py", line 554, in send_task_message
**properties
File env/lib/python2.7/site-packages/kombu/messaging.py", line 178, in publish
exchange_name, declare,
File env/lib/python2.7/site-packages/kombu/connection.py", line 527, in _ensured
errback and errback(exc, 0)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/contextlib.py", line 35, in __exit__
self.gen.throw(type, value, traceback)
File env/lib/python2.7/site-packages/kombu/connection.py", line 419, in _reraise_as_library_errors
sys.exc_info()[2])
File env/lib/python2.7/site-packages/kombu/connection.py", line 414, in _reraise_as_library_errors
yield
File env/lib/python2.7/site-packages/kombu/connection.py", line 515, in _ensured
reraise_as_library_errors=False,
File env/lib/python2.7/site-packages/kombu/connection.py", line 405, in ensure_connection
callback)
File env/lib/python2.7/site-packages/kombu/utils/functional.py", line 333, in retry_over_time
return fun(*args, **kwargs)
File env/lib/python2.7/site-packages/kombu/connection.py", line 261, in connect
return self.connection
File env/lib/python2.7/site-packages/kombu/connection.py", line 802, in connection
self._connection = self._establish_connection()
File env/lib/python2.7/site-packages/kombu/connection.py", line 757, in _establish_connection
conn = self.transport.establish_connection()
File env/lib/python2.7/site-packages/kombu/transport/pyamqp.py", line 130, in establish_connection
conn.connect()
File env/lib/python2.7/site-packages/amqp/connection.py", line 294, in connect
self.transport.connect()
File env/lib/python2.7/site-packages/amqp/transport.py", line 103, in connect
self._connect(self.host, self.port, self.connect_timeout)
File env/lib/python2.7/site-packages/amqp/transport.py", line 144, in _connect
self.sock.connect(sa)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 228, in meth
return getattr(self._sock,name)(*args)
OperationalError: [Errno 61] Connection refused
答案 0 :(得分:1)
呀!我知道了!我有同样的问题。 在文件myproj / app1 / tasks.py中:
from __future__ import absolute_import
from celery import task
app = Celery('myproj_local')
app.config_from_object('django.conf:settings')
@app.task(name='random_name')
def test():
print('this is a test')
然后,芹菜将在“app”中初始化,配置将被加载到“app”中,您的任务将被延迟。
但只有在您的配置有效时它才会起作用。
答案 1 :(得分:0)
您需要将BROKER_URL设置为指向REDIS。
如果您只有一个队列,请确保您的工作人员已连接到默认队列。
如果您在设置中指定了默认队列,则需要将工作人员设置为提取任务,如下所示:
celery -A myproj.local.celery worker -l info -Q queue_name