Django 和 celery : Tasks not imported

标签 django celery django-celery kombu

我正在使用 Django 和 Celery 在后台运行与联系人/电子邮件解析相关的两个任务。

结构是:

project
   /api
   /core
       tasks.py
   settings.py

settings.py 文件包含:
BROKER_URL = 'django://'
BROKER_BACKEND = "djkombu.transport.DatabaseTransport"

#celery
BROKER_HOST = "localhost"
BROKER_PORT = 5672
BROKER_USER = "guest"
BROKER_PASSWORD = "guest"
BROKER_VHOST = "/"

sys.path.append(os.path.dirname(os.path.basename(__file__)))
CELERY_IMPORTS = ['project.core.tasks']

import djcelery
djcelery.setup_loader()

# ....

INSTALLED_APPS = (
    #...

    'kombu.transport.django',
    'djcelery',
)

tasks.py 包含:
from celery.task import Task
from celery.registry import tasks

class ParseEmails(Task):
    #...

class ImportGMailContactsFromGoogleAccount(Task):
    #...

tasks.register(ParseEmails)
tasks.register(ImportGMailContactsFromGoogleAccount)

另外,在 wsgi.py 中添加
os.environ["CELERY_LOADER"] = "django"

现在,我在 WebFactional 服务器上托管了这个应用程序。在我的本地主机上运行良好,但在 WebFaction 服务器上,Django 应用程序部署在 Apache 服务器上,我得到:
2013-01-23 17:25:00,067: ERROR/MainProcess] Task project.core.tasks.ImportGMailContactsFromGoogleAccount[df84e03f-9d22-44ed-a305-24c20407f87c] raised exception: Task of kind 'project.core.tasks.ImportGMailContactsFromGoogleAccount' is not registered, please make sure it's imported.

但任务显示为已注册。如果我跑
python2.7 manage.py celeryd -l info

我获得:
 -------------- celery@web303.webfaction.com v3.0.13 (Chiastic Slide)
---- **** ----- 
--- * ***  * -- [Configuration]
-- * - **** --- . broker:      django://localhost//
- ** ---------- . app:         default:0x1e55350 (djcelery.loaders.DjangoLoader)
- ** ---------- . concurrency: 8 (processes)
- ** ---------- . events:      OFF (enable -E to monitor this worker)
- ** ---------- 
- *** --- * --- [Queues]
-- ******* ---- . celery:      exchange:celery(direct) binding:celery
--- ***** ----- 

[Tasks]
  . project.core.tasks.ImportGMailContactsFromGoogleAccount
  . project.core.tasks.ParseEmails

我认为这可能是一个相对导入错误,但我认为 settings.py 和 wsgi.py 中的更改会阻止这种情况发生。

我认为 WebFactional 支持的多个 Python 版本可能与此有关,但是我安装了 Python 2.7 的所有库,并且我也在运行 Django 2.7,所以应该没有问题。

使用 celeryd -l info 在 localhost 中运行,当我启动工作程序时,任务也会显示在列表中,但是当我调用任务时它不会输出错误 - 它运行完美。

谢谢

最佳答案

我在新的 Ubuntu 12.04/Apache/mod_wsgi/Django 1.5/Celery 3.0.13 生产环境中遇到了同样的问题。在我的 Mac Os X 10.8 笔记本电脑和我的旧服务器(装有 Celery 3.0.12)上一切正常,但在新服务器上却没有。

Celery 中似乎存在一些问题:
https://github.com/celery/celery/issues/1150

我最初的解决方案是将基于 Task 类的任务更改为基于 @task 装饰器的任务,如下所示:

class CreateInstancesTask(Task):
    def run(self, pk):
        management.call_command('create_instances', verbosity=0, pk=pk)
tasks.register(CreateInstancesTask)

像这样:
@task()
def create_instances_task(pk):
    management.call_command('create_instances', verbosity=0, pk=pk)

现在这项任务似乎有效,但当然我必须做一些进一步的测试......

关于 Django 和 celery : Tasks not imported,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14491327/

相关文章:

python - 电影Py错误: FFMPEG permission error

python - 通过子进程将python的文件之类的对象传递给ffmpeg

Celery 任务永久启动(不重试)

python - 如何在 ubuntu 服务器上守护 django celery 周期性任务?

python - Heroku 上的 Django Celery 任务导致内存使用率过高

django - 相关字段列表过滤器 Django

django - Django 请求处理的图表/说明?

django - 如何从 celery-django 项目安全连接到 Azure redis?

python - mod_wsgi 3.4 错误,其中 404 错误被误解

python - celery 任务装饰器抛出 "TypeError: ' 模块对象不可调用”