I'm running Redis, Celery 4.0 and Django 1.10 but receive a [Errrno 61] connection refused error when running task 'test' from shell. This is my project structure:
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/local/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/local/__init__.py
:
from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app
__all__ = ['celery_app']
I think something is wrong in this init file because the task runs from shell when I move the content to myproj/myproj/__init__.py
:
from __future__ import absolute_import, unicode_literals
from .local.celery import app as celery_app
__all__ = ['celery_app']
Celery is running in the myproj directory with command:
celery -A myproj.local.celery worker -l info
The full error:
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
Yeah! I got it! I had same problem. In file 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')
Then, celery will be initialized in "app", and config will be loaded in "app", and your task will be delayed.
But it will work only if your config is valid.
You need to set the BROKER_URL to point to REDIS.
If you have one queue only, make sure your worker is connected to default queue.
If you specified default queue in your settings, you need to set your worker to pickup task as below:
celery -A myproj.local.celery worker -l info -Q queue_name
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With