在 Python 中设置 celery 任务后端的麻烦

Posted

技术标签:

【中文标题】在 Python 中设置 celery 任务后端的麻烦【英文标题】:trouble in setting celery tasks backend in Python 【发布时间】:2018-12-18 19:07:49 【问题描述】:

我遵循 [ http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html ] 中给出的所有步骤 这是代码:

from __future__ import absolute_import
from celery import Celery

#app = Celery('tasks', broker='pyamqp://guest@localhost//')
app = Celery('tasks', backend='redis://localhost', broker='pyamqp://guest@localhost//')
@app.task
def add(x, y):
   return x + y

当我使用以下命令运行 celery worker 时

celery -A tasks worker --loglevel=info

设置后端时出现语法错误。这是错误信息:

[2018-07-10 16:37:21,970: CRITICAL/MainProcess] 不可恢复的错误:SyntaxError('invalid syntax', ('c:\users\user_\appdata\local\programs\python\python37-32\ lib\site-packages\celery\backends\redis.py', 22, 19, 'from . import async, base\n'))Traceback(最近一次调用最后):文件“c:\users\user_\appdata\ local\programs\python\python37-32\lib\site-packages\kombu\utils\objects.py",第 42 行,在 get 中返回 obj.dict[self .name] KeyError: 'backend' 在处理上述异常的过程中,发生了另一个异常: Traceback (last last call last): File "c:\users\user_\appdata\local\programs\python \python37-32\lib\site-packages\celery\worker\worker.py”,第 205 行,在 start self.blueprint.start(self) 文件“c:\users\user_\appdata\local\programs\python\ python37-32\lib\site-packages\celery\bootsteps.py”,第 115 行,在 start self.on_start() 文件“c:\users\user_\appdata\local\programs\python\python37-32\lib\站点包\芹菜\应用\工人。 py”,第 139 行,on_start self.emit_banner() 文件“c:\users\user_\appdata\local\programs\python\python37-32\lib\site-packages\celery\apps\worker.py”,行154, 在 emit_banner '\n', self.startup_info(artlines=not use_image))), 文件 "c:\users\user_\appdata\local\programs\python\python37-32\lib\site-packages\celery\ apps\worker.py”,第 217 行,在 startup_info results=self.app.backend.as_uri(),文件“c:\users\user_\appdata\local\programs\python\python37-32\lib\site-packages \kombu\utils\objects.py",第 44 行,在 get 中 value = obj.dict[self.name] = self.get(obj) 文件“c:\users\user\appdata\local\programs\python\python37-32\lib\site-packages\celery\app\base.py”,行1196,在后端返回 self.get_backend() 文件“c:\users\user\appdata\local\programs\python\python37-32\lib\site-packages\celery\app\base. py”,第 914 行,在 get_backend self.loader) 文件“c:\users\user\appdata\local\programs\python \python37-32\lib\site-packages\celery\app\backends.py",第 70 行,在 by_url 中返回 by_name(backend, loader),url 文件 "c:\users\user\appdata\local \programs\python\python37-32\lib\site-packages\celery\app\backends.py”,第 50 行,在 by_name cls = symbol_by_name(backend, aliases) 文件“c:\users\user_\appdata\local\程序\python\python37-32\lib\site-packages\kombu\utils\imports.py”,第 56 行,在 symbol_by_name 模块 = imp(module_name, package=package, **kwargs) 文件“c:\users\user_ \appdata\local\programs\python\python37-32\lib\importlib_init_.py",第 127 行,在 import_module 返回 _bootstrap._gcd_import(name[level:], package, level) 文件"",第 1006 行,在 _gcd_import 文件中 "",第 983 行,在 _find_and_load 文件中 "",第 967 行,在 _find_and_load_unlocked 文件中"",第 677 行,在 _load_unlocked 文件中"",第 724 行,在 exec_module 文件中"",第 860 行, 在 get_code File "", line 791, in source_to_code File "", line 219, in call_with_frames_removed File "c:\users\us er\appdata\local\programs\python\python37-32\lib\site-packages\celery\backends\redis.py”,第 22 行来自 . import async, base ^ SyntaxError: invalid syntax

但是,当我使用注释行时,我没有任何问题,只是结果后端被禁用,我需要将结果后端设置为 redis-server

【问题讨论】:

【参考方案1】:

我解决了这个问题。问题的主要原因是我使用的是 Python 3.7。但是,据我所知,Celery 目前适用于 Python 3.6 及更低版本。我对 Celery 代码进行了以下更改:

    将“C:\Users\myusername\AppData\Local\Programs\Python\Python37-32\Lib\site-packages\celery\backends\async.py”重命名为“C:\Users\myusername\ AppData\Local\Programs\Python\Python37-32\Lib\site-packages\celery\backends\asynchronous.py"

    打开 redis.py 并将每行关键字“async”更改为“asynchronous”。

显然,

异步

现在是 Python 3 中的关键字。

您也可以阅读此链接:https://github.com/celery/celery/issues/4500

希望这个答案能帮助所有遇到相同问题的人,直到新版本的 Celery 发布。


更新:这是 Python 3.7 的问题。您可以使用 Python 3.6 而不是这样的问题。但是,如果您想继续使用 Python 3.7 和 celery[redis],您可以使用上述解决方案来解决问题。

【讨论】:

“Celery 目前仅适用于 Python 2”。不正确。问题在于 Python 3.7,而不是一般的 Python 3。 @CS 正确!如果你使用 Python 3.6,你不应该有这样的问题。但是,Python 3.7 存在问题。 除了你的解决方案,有些人可能更喜欢pip install --upgrade https://github.com/celery/celery/tarball/master。无论如何,感谢您的提问和回答 对于rabbitmq,你需要在rpc.py中进行相应的修改。 另外,您可能需要将 redis.py 中的 async.asynchronousBackendMixin 编辑为 asynchronous.AsyncBackendMixin。我不得不为 celery 4.2.2【参考方案2】:

支持@Ai Da,你应该在redis.py中维护AsyncBackendMixin

【讨论】:

【参考方案3】:

你有没有尝试在后端参数中添加redis端口和db? 要么 在 Celery 配置文件中添加参数 CELERY_REDIS_HOST CELERY_REDIS_PORT CELERY_REDIS_DB CELERY_RESULT_BACKEND CELERY_RESULT_PASSWORD

【讨论】:

在哪里可以找到 celery 配置文件?我正在使用 Windows。 您必须为应用程序的配置创建自己的文件并在您的主 celery 文件中调用它们。 好的。我添加了一个 celeryconfig.py 并将其导入到我的主文件中。配置文件内容是 BROKER_URL = 'pyamqp://guest@localhost//' CELERY_RESULT_BACKEND = 'redis://localhost' 然后我设置 app = Celery('tasks') 但后端被禁用 使用类似: CELERY_REDIS_HOST = 'localhost' CELERY_REDIS_PORT = 6379 # 无论redis在哪个端口上运行 CELERY_REDIS_DB = 0 # 通常默认为0 CELERY_RESULT_BACKEND = 'redis' CELERY_RESULT_PASSWORD = "your_password" 谢谢,但我仍然得到“结果:禁用://”【参考方案4】:

看起来像用

安装
pip install git+https://github.com/vBlackOut/django-celery.git --upgrade

为我工作

【讨论】:

以上是关于在 Python 中设置 celery 任务后端的麻烦的主要内容,如果未能解决你的问题,请参考以下文章

Django Celery 任务日志

在supervisord中设置环境变量时出现Python键错误

如何获取 celery broker 和后端的状态?

Django中使用celery来异步处理和定时任务

在 typescript / angular2 环境和后端的 nodejs 中设置持久会话时遇到问题

Celery Beat 调度程序不会在 Django 中执行我的任务