CELERY_ALWAYS_EAGER 好像没有效果

CELERY_ALWAYS_EAGER seems to have no effect

我有一个 Django + Celery 设置在生产环境中与 RabbitMQ 一起正常工作。

A​​FAIK,在本地 django 设置中将 CELERY_ALWAYS_EAGER 设置为 True 应该就足够了,以避免为开发设置 RabbitMQ。我已经这样做了,但是在任务上调用 .delay() 时,我得到:

Traceback (most recent call last):
  File "lib/python2.7/site-packages/django/core/handlers/base.py", line 132, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "lib/python2.7/site-packages/django/views/generic/base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "lib/python2.7/site-packages/django/views/generic/base.py", line 89, in dispatch
    return handler(request, *args, **kwargs)
  File "lib/python2.7/site-packages/django/views/generic/edit.py", line 215, in post
    return self.form_valid(form)
  File "app/web/views.py", line 188, in form_valid
    form.send_email()
  File "app/web/forms.py", line 17, in send_email
    send_email.delay(mail, recipients, 'Contact %s' % name, comment)
  File "lib/python2.7/site-packages/celery/app/task.py", line 453, in delay
    return self.apply_async(args, kwargs)
  File "lib/python2.7/site-packages/celery/app/task.py", line 559, in apply_async
    **dict(self._get_exec_options(), **options)
  File "lib/python2.7/site-packages/celery/app/base.py", line 353, in send_task
    reply_to=reply_to or self.oid, **options
  File "lib/python2.7/site-packages/celery/app/amqp.py", line 305, in publish_task
    **kwargs
  File "lib/python2.7/site-packages/kombu/messaging.py", line 172, in publish
    routing_key, mandatory, immediate, exchange, declare)
  File "lib/python2.7/site-packages/kombu/connection.py", line 457, in _ensured
    interval_max)
  File "lib/python2.7/site-packages/kombu/connection.py", line 369, in ensure_connection
    interval_start, interval_step, interval_max, callback)
  File "lib/python2.7/site-packages/kombu/utils/__init__.py", line 243, in retry_over_time
    return fun(*args, **kwargs)
  File "lib/python2.7/site-packages/kombu/connection.py", line 237, in connect
    return self.connection
  File "lib/python2.7/site-packages/kombu/connection.py", line 741, in connection
    self._connection = self._establish_connection()
  File "lib/python2.7/site-packages/kombu/connection.py", line 696, in _establish_connection
    conn = self.transport.establish_connection()
  File "lib/python2.7/site-packages/kombu/transport/librabbitmq.py", line 123, in establish_connection
    conn = self.Connection(**opts)
  File "lib/python2.7/site-packages/librabbitmq/__init__.py", line 199, in __init__
    self.connect()
ConnectionError: Error opening socket: a socket error occurred

所以我找到了问题所在。基本上我失踪了:

from .celery import app as celery_app

proj/proj/__init__.py

出于某种神秘原因,这似乎仅在 运行 runserver 时失败,而不是在 运行 wsgi.py 时通过 uWSGI 失败。不知道为什么,但是通过导入它也适用于 runserver

郑重声明,因为 celery 4.0 this setting has been renamed to task_always_eager:

# setting renamed on celery 4.0
CELERY_ALWAYS_EAGER --> task_always_eager

为了帮助迁移到这个版本,Celery 提供了以下实用程序来自动更新您的设置:

# --django allows to keep uppercase settings and CELERY_ prefix
$ celery upgrade settings proj/settings.py --django