Toon
Toon

Reputation: 131

Django Celery socket.error [Errno 61] Connection refused

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

Upvotes: 4

Views: 7008

Answers (3)

Sooth
Sooth

Reputation: 3084

I was running into this same issue and when I debugged I could see that the following code:

from my_app.tasks import my_task
my_task.delay()

Was raising exception:

[Errno 61] Connection refused

This was because my celery configuration was not being executed and the default configuration was being setup for celery which tried to use Connection.ensure._ensured client with:

<Connection: amqp://guest:**@127.0.0.1:5672// at 0x16c5dfd50>

I was trying to configure Redis and expected the my_project/celery.py to have been executed but it was not.

The fix is to load the celery configuration in the Django project init file. Here is the my_project/__init__.py content that will properly load the celery configuration:

from .celery import app as celery_app
__all__ = ('celery_app',)

After adding this, calling the delpoy method no longer raises an exception and the job gets properly enqueued.

Upvotes: 0

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.

Upvotes: 2

kkiat
kkiat

Reputation: 571

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

Upvotes: 1

Related Questions