Celery AttributeError:异步错误

DYo*_*ung 58 python celery celery-task

我在我的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
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试在运行Kali 2018.2的ODROID-C2上运行Celery worker时(w.当前更新,运行时出现以下错误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
Run Code Online (Sandbox Code Playgroud)

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

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

celery --version
4.1.0 (latentcall)
Run Code Online (Sandbox Code Playgroud)

shi*_*zer 94

我们只是通过更新到芹菜== 4.1.1进行排序

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

  • 请注意这个,因为这是正确的答案.如果你设置`kombu == 4.1.0`然后再升级芹菜,你只会再次遇到这个问题. (9认同)

rya*_*hta 25

确保您使用的是Kombu 4.1.0.最新版本的Kombu将异步重命名为异步.

  • 正确的答案是下面的@shipperizer.而是升级到`celery == 4.1.1`.如果你设置`kombu == 4.1.0`,那么当你将芹菜升级到4.1.0之后,你会再遇到这个问题. (8认同)

Geo*_*off 13

Celery没有将kombu和台球的要求固定在特定版本上.他们需要以下内容:

billiard>=3.5.0.2,<3.6.0
kombu>=4.0.2,<5.0
Run Code Online (Sandbox Code Playgroud)

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

kombu 4.2.0发布了一个重大变化,以前版本的芹菜自动安装它.

由于Celery没有固定特定版本,如果您继续使用芹菜4.1.0,您应该遵循以下规则:

kombu==4.1.0
billiard==3.5.0.2
Run Code Online (Sandbox Code Playgroud)

  • 应该是`billiard == 3.5.0.2`.点击安装将失败并显示"3.0.5.2". (2认同)

吴毅凡*_*吴毅凡 8

pip install --upgrade 'celery>=4.2.0rc4'

kombu==4.2.0重命名asyncasynchronous,芹菜固定它celery==4.2.0rc4.

所以你应该把芹菜升级到4.2.0rc4.

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


DYo*_*ung 6

这就是问题,实际上是海带版.

我设法安装了2个版本的kombu,4.2.0作为'appuser'用户,我试图启动工作者,4.1.0作为'root'.4.1.0 'root'将工作,其他用户没有.

我从'appuser'用户帐户(作为该用户的pip uninstall kombu)中删除了kombu 4.2.0 ,因此它将使用系统范围内安装的软件包,并且Celery worker在该帐户下正常运行.

为了验证它实际上是kombu 4.2.0中断,我删除了系统范围的4.1.0版本并让pip安装最新版本,它获得4.2.0,并且Celery工作者将不再启动.我卸载它并强制pip安装4.1.0(pip install kombu == 4.1.0)并且工作人员正常运行.

作为另一个检查,我去了我的Mac,我最初编写/测试了这段代码,并检查了由pip:4.1.0安装的kombu版本.我不确定为什么pip on the Mac和Pi3安装了4.1.0版本的kombu而pip在ODROID-C2上安装了4.2.0版本.如果我有机会,我会挖掘更多,但它现在有效.