CELERY_ALWAYS_EAGER 好像没有效果

Luc*_*rti 5 django celery

我有一个 Django + Celery 设置,可以在使用 RabbitMQ 的生产中正常工作。

AFAIK,在本地 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
Run Code Online (Sandbox Code Playgroud)

chk*_*chk 9

作为记录,自celery 4.0以来,此设置已重命名为task_always_eager

# setting renamed on celery 4.0
CELERY_ALWAYS_EAGER --> task_always_eager
Run Code Online (Sandbox Code Playgroud)

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

# --django allows to keep uppercase settings and CELERY_ prefix
$ celery upgrade settings proj/settings.py --django
Run Code Online (Sandbox Code Playgroud)

  • 当然,谁会梦想重命名允许您测试不提供输出或日志的异步任务的变量会导致任何混乱。就让事情默默地失败吧,不用担心。 (6认同)

Luc*_*rti 2

所以我发现了问题所在。基本上我失踪了:

from .celery import app as celery_app

proj/proj/__init__.py

由于某些神秘的原因,这似乎仅在运行时失败runserver,而不是wsgi.py通过运行时失败uWSGI。不知道为什么,但通过导入它runserver也可以工作。