【问题标题】:Celery AttributeError: async errorCelery AttributeError:异步错误
【发布时间】:2018-10-30 21:10:47
【问题描述】:

我在我的 Mac (OS/X 10.13.4) 上本地运行 RabbitMQ 和 Celery,当我运行 add.delay(x,y) 时,以下代码在本地运行:

#!/usr/bin/env python
from celery import Celery
from celery.utils.log import get_task_logger

logger = get_task_logger(__name__)

app = Celery('tasks', \
        broker='pyamqp://appuser:xx@c2/appvhost', \
        backend='db+mysql://appuser:xx@c2/pigpen')

@app.task(bind=True)
def dump_context(self, x, y):
    print('Executing task id {0.id}, args: {0.args!r} kwargs {0.kwargs!r}'.format(self.request))

@app.task
def add(x, y):
    logger.info('Adding {0} + {1}'.format(x, y))
    return x + y

但是,当我尝试在运行 Kali 2018.2 的 ODROID-C2 上运行 Celery worker 时(使用当前更新,运行 celery -A tasks worker --loglevel=info 时出现以下错误:

Traceback (most recent call last):
  File "/usr/local/bin/celery", line 11, in <module>
    sys.exit(main())
  File "/usr/local/lib/python2.7/dist-packages/celery/__main__.py", line 14, in main
    _main()
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/celery.py", line 326, in main
    cmd.execute_from_commandline(argv)
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/celery.py", line 488, in execute_from_commandline
    super(CeleryCommand, self).execute_from_commandline(argv)))
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/base.py", line 281, in execute_from_commandline
    return self.handle_argv(self.prog_name, argv[1:])
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/celery.py", line 480, in handle_argv
    return self.execute(command, argv)
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/celery.py", line 412, in execute
    ).run_from_argv(self.prog_name, argv[1:], command=argv[0])
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/worker.py", line 221, in run_from_argv
    return self(*args, **options)
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/base.py", line 244, in __call__
    ret = self.run(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/worker.py", line 255, in run
    **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/celery/worker/worker.py", line 99, in __init__
    self.setup_instance(**self.prepare_args(**kwargs))
  File "/usr/local/lib/python2.7/dist-packages/celery/worker/worker.py", line 122, in setup_instance
    self.should_use_eventloop() if use_eventloop is None
  File "/usr/local/lib/python2.7/dist-packages/celery/worker/worker.py", line 241, in should_use_eventloop
    self._conninfo.transport.implements.async and
  File "/home/autossh/.local/lib/python2.7/site-packages/kombu/transport/base.py", line 125, in __getattr__
    raise AttributeError(key)
AttributeError: async

从 Kali ODROID,我可以使用 Python Pika 脚本连接到名为 c2 的主机上的 RabbitMQ 实例,并且该设备中的 mysql 也可以连接到 c2 机器。我发现了类似的错误,这些解决方案都不适合我。

通过pip安装在ODROID-C2上的Celery版本为:

celery --version
4.1.0 (latentcall)

【问题讨论】:

  • 有点不高兴,它似乎破坏了很多人的产品。还有一些关于它的 GitHub 问题......

标签: python celery celery-task


【解决方案1】:

我们通过更新到 celery==4.1.1 进行排序

似乎 4.1.X 的最新版本整理了 kombu 上的模块名称更改

【讨论】:

  • 请点赞,因为这是正确答案。如果您设置kombu==4.1.0,然后再升级 celery,您将再次遇到此问题。
【解决方案2】:

确保您使用的是 Kombu 4.1.0。最新版本的 Kombu 将 async 重命名为 asynchronous。

【讨论】:

  • 我在该设备上支持 kombu 到 4.1.0 只是为了看看它是否有帮助,但没有。
  • kombu 不应该升级到 5.x 吗?
  • 正确答案是下面的@shipperizer。而是升级到celery==4.1.1。如果你设置了kombu==4.1.0,当你升级 celery 到 4.1.0 以上时,你会再次遇到这个问题。
【解决方案3】:

Celery 不会将其对海带和台球的要求固定在特定版本上。他们需要以下内容:

billiard>=3.5.0.2,<3.6.0
kombu>=4.0.2,<5.0

https://github.com/celery/celery/blob/v4.1.0/requirements/default.txt

kombu 4.2.0 发布了一个重大更改,之前版本的 celery 会自动安装它。

由于 Celery 不固定特定版本,如果您将继续使用 celery 4.1.0,则应固定到以下内容:

kombu==4.1.0
billiard==3.5.0.2

【讨论】:

  • 应该是billiard==3.5.0.2。 Pip 安装将失败并显示 3.0.5.2
  • 谢谢,我在安装 Celery 之前将我的 post deploy/fistboot 脚本设置为安装 kombu==4.1.0。
【解决方案4】:

pip install --upgrade 'celery&gt;=4.2.0rc4'

kombu==4.2.0async 重命名为 asynchronous,celery 将其修复为 celery==4.2.0rc4

所以你应该升级 celery 到 4.2.0rc4。

参考:https://github.com/celery/celery/commit/c8ef7ad60b72a194654c58beb04a1d65cd0435ad

【讨论】:

  • 4.1.1 正式版修复了这个问题。
【解决方案5】:

这就是问题所在,实际上是 kombu 版本。

我设法安装了 2 个版本的 kombu,4.2.0 作为 'appuser' 用户,我试图在其下启动工作程序,4.1.0 作为 'root''root' 的 4.1.0 可以工作,其他用户则不能。

我从'appuser' 用户帐户中删除了kombu 4.2.0(以该用户的身份pip卸载kombu),因此它将使用系统范围的安装包,并且Celery worker在该帐户。

为了验证实际上是 kombu 4.2.0 坏了,我删除了系统范围的 4.1.0 版本并让 pip 安装最新版本,它得到 4.2.0,Celery worker 会 不再开始。我卸载它并强制 pip 安装 4.1.0 (pip install kombu==4.1.0) 并且工人正常运行。

作为另一项检查,我去了我最初编写/测试此代码的 Mac,并检查了通过 pip 安装的 kombu 版本:4.1.0。我不确定为什么 Mac 和 Pi3 上的 pip 安装了 4.1.0 版本的 kombu,而 ODROID-C2 上的 pip 安装了 4.2.0 版本。如果有机会,我会挖掘更多,但现在可以了。

【讨论】:

  • 因为 kombu 4.2.0 是在这篇文章发布前几个小时发布的。我猜当你安装带有root 的 pip 包时,它是 4.2.0 之前的版本,而安装 w/appuser 时它是 4.2.0 之后的版本,因为正如@Daniel 所说,芹菜没有t 固定版本,因此只需安装 的最新版本
【解决方案6】:

一个快速的破解方法是禁用结果后端:

# CELERY_RESULT_BACKEND = 'redis://redis'

【讨论】:

    猜你喜欢
    • 2023-02-09
    • 2021-11-08
    • 2012-11-01
    • 1970-01-01
    • 2014-09-08
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    相关资源
    最近更新 更多