Django 1.9 + Celery 未注册任务

Posted

技术标签:

【中文标题】Django 1.9 + Celery 未注册任务【英文标题】:Django 1.9 + Celery unregistered tasks 【发布时间】:2016-11-27 08:45:24 【问题描述】:

此配置正确。我开始吃芹菜 错误的方式:(,没有指定项目名称。(芹菜工人-A hockey_manager -l 信息

我确实从 1.6.5 升级到 Django 1.9,但无法使 celery 配置再次工作。

在寻找解决方案将近两天后,我没有发现任何可行的方法。

Celery 没有检测到我的任务。我试过了:

CELERY_IMPORTS 自动发现任务 绑定=真

依赖关系

amqp==2.0.3 
celery==3.1.23 
Django==1.9.8 
django-celery==3.1.17
kombu==3.0.35

项目结构

hockey_manager/__init__.py

from __future__ import absolute_import

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

hockey_manager/celery.py

from __future__ import absolute_import

import os

from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hockey_manager.settings.common')

app = Celery('hockey_manager')

# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')

# load task modules from all registered Django app configs.
app.autodiscover_tasks(['hockey'])

# Using a string here means the worker will not have to
# pickle the object when using Windows.
# app.config_from_object('django.conf:settings')
# app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

# Celery backend configs
app.conf.update(
    CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend',
)

if __name__ == '__main__':
    app.start()


@app.task(bind=True)
def debug_task(self):
    print('Request: 0!r'.format(self.request))

hockey_manager/settings/common.py

INSTALLED_APPS = [
    ...
    'hockey',
    'djcelery',
    'kombu.transport.django',
    ...
]

##
# Celery
##
# BROKER_POOL_LIMIT = 3
BROKER_URL = os.environ.get('CLOUDAMQP_URL')
#BROKER_URL = 'django://'

# List of modules to import when celery starts.
CELERY_IMPORTS = ('hockey.tasks', )

#: Only add pickle to this list if your broker is secured
#: from unwanted access (see userguide/security.html)

CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'

曲棍球/tasks.py

from __future__ import absolute_import
from hockey_manager.celery import app

@app.task(name='hockey.tasks.league_schedule_results')
def league_schedule_results(schedule, statistics):
    ...

Celery 出错

[2016-07-23 17:05:46,231: ERROR/MainProcess] 收到未注册 'hockey.tasks.league_schedule_results' 类型的任务。 该消息已被忽略并丢弃。

从 2.0 版开始,我还收到了来自 amqp 的弃用警告:

AMQPDeprecationWarning:连接上的 .transport 属性是 之前访问过 连接已建立。目前支持此功能,但将 在 amqp 2.2.0 中被弃用。

Since amqp 2.0 you have to explicitly call Connection.connect()
before using the connection.

  W_FORCE_CONNECT.format(attr=attr)))

【问题讨论】:

【参考方案1】:

使用django-celery 模块。

这里是link 示例如何在 django 1.9.1+ 中使用django-celery

【讨论】:

我已经在使用它了。它显示在我的依赖项列表中。版本 3.1.17 我在 django 1.9.1 中使用它,我不需要 celery.py 文件进行配置。我只是给你建议尝试链接中提到的步骤。可能按照这些步骤,您将使用 django 1.9.1 正确配置 celery 我会试一试,让你知道。谢谢 我不知道为什么,但它有效:D。感谢您的提示;)很高兴知道其中的原因。 ***.com/questions/8920643/…

以上是关于Django 1.9 + Celery 未注册任务的主要内容,如果未能解决你的问题,请参考以下文章

Django 1.9 + celery + django-celry 实现定时任务

celery - 尽管已注册,但任务未运行。芹菜控制台不反映任务的接收

django —— Celery实现异步和定时任务

如何在 django celery 中处理未完成的任务

未执行的任务(Django + Heroku + Celery + RabbitMQ)

Celery 收到未注册类型的任务(运行示例)