如何在 Django 1.11 中运行 celery worker

Posted

技术标签:

【中文标题】如何在 Django 1.11 中运行 celery worker【英文标题】:How to run celery worker in Django 1.11 【发布时间】:2017-11-14 03:25:22 【问题描述】:

我已将 Django 从 1.7 版升级到 1.11.2 版,将 Celery 从 3.1.25 版升级到 4.0.1 版。

在此升级之前,我能够以这种方式运行 celery workers throw django-celery 包:

python manage.py celery worker -Q <my_queue> --app=proj.celery:app --concurrency=5

阅读 Celery 发行说明和文档,我发现使用 Django ORM 作为结果后端,我不能再使用 django-celery 包,但我必须使用 django-celery-resultsdjango-celery-beat,而不是它。

使用相同的命令我不能再运行工人了。 更详细地说,我尝试运行以下命令:

celery worker -app=proj.celery:app -l info

其中 celery 是我的 virtualenv 中的 celery.exe 文件 (virtual_env_name\Scripts\celery.exe)。

这引发了以下错误:

Traceback (most recent call last):
   File "c:\python27\Lib\runpy.py", line 162, in _run_module_as_main
"__main__", fname, loader, pkg_name)
 File "c:\python27\Lib\runpy.py", line 72, in _run_code
    exec code in run_globals
  File "C:\Python27\virtualenv\<virtual_env_name>\Scripts\celery.exe\__main__.py", line 5, in <module>
  File "path\of\my\project\celery.py", line 8, in <module>
    from celery import Celery
ImportError: cannot import name Celery

我尝试直接从命令行导入 celery,效果很好。运行命令时出现问题

celery.py 文件

from __future__ import absolute_import
import os
from celery import Celery
import django

django.setup()

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')

app = Celery('proj')

app.config_from_object('django.conf:settings')
app.autodiscover_tasks()


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

项目结构

- main
    - proj
        - __init__.py
        - setting.py
        - celery.py
- manage.py

我正在运行 Python2.7 和 Windows 32。

提前致谢

【问题讨论】:

【参考方案1】:

来自Celery 4 documentation:

不再支持 Microsoft Windows。

测试套件正在通过,Celery 似乎可以在 Windows 上运行,但我们不做任何保证,因为我们无法诊断此平台上的问题。如果您是需要此平台支持的公司,请与我们联系。

很遗憾,无法再在 Windows 上运行 celery worker。您必须使用 3.1.x 版本...

【讨论】:

是的,我看过了,但是好像不支持但是测试套件通过了.. 其实我在windows上导入Celery 4是没有问题的,但是台球和ampq有问题(看这个:github.com/celery/celery/issues/4082)反正现在用celery 4还是很困难的Windows,所以只要它没有修复/修补/分叉,你应该坚持使用 celery 3 感谢您的链接!无论如何,如果我尝试从命令行(virtualenv 的 python)导入 celery 效果很好。运行 celery 命令时出现的问题... 我使用了一个和你类似的 celery.py,但是使用的是 python 3,并且导入成功。也许您可以删除在这种情况下似乎没用的 absolute_import,但我不确定。也许其他人会有更好的主意

以上是关于如何在 Django 1.11 中运行 celery worker的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 1.11 中查找给定月份每周的记录数?

Django 1.11 如何从保存在 CMS 站点模型中的 HTML 中显示模板变量

Django 1.11:在 url 中的查询参数中浮动

扩展 Django 1.11 用户模型

在 Celery 3.1.11 中使用 Django 进行单元测试?

在 Django 1.11 中启用 CORS