61 votes

Celery AttributeError : erreur asynchrone

J'ai RabbitMQ et Celery fonctionnant localement sur mon Mac (OS/X 10.13.4), le code suivant fonctionne localement lorsque j'exécute 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

Cependant, lorsque j'essaie d'exécuter le travailleur Celery sur un ODROID-C2 exécutant Kali 2018.2 (avec les mises à jour actuelles), j'obtiens l'erreur suivante lors de l'exécution 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

Depuis l'ODROID de Kali, je suis en mesure de me connecter à l'instance RabbitMQ sur l'hôte nommé c2 en utilisant un Pika script Python et mysql à partir de ce périphérique fonctionne également sur la machine c2. J'ai trouvé des erreurs similaires, aucune de ces solutions n'a fonctionné pour moi.

La version de Celery installée sur l'ODROID-C2 via pip est :

celery --version
4.1.0 (latentcall)

3 votes

Légèrement mécontent qu'il semble casser la prod de plusieurs personnes. Il y a aussi quelques problèmes sur GitHub à ce sujet...

102voto

shipperizer Points 1337

Nous avons trié en mettant simplement à jour vers celery==4.1.1

Il semble que la dernière version de la 4.1.X ait résolu le problème du changement de nom du module sur kombu.

9 votes

Veuillez voter en haut de page car c'est la bonne réponse. Si vous réglez kombu==4.1.0 et que vous mettez ensuite à niveau le céleri, vous rencontrerez à nouveau ce problème.

27voto

ryanmehta Points 314

Assurez-vous que vous utilisez Kombu 4.1.0. La dernière version de Kombu renomme async en asynchrone.

0 votes

J'ai fait une sauvegarde de kombu en 4.1.0 sur cet appareil juste pour voir si ça aidait, mais non.

1 votes

Kombu n'aurait-il pas dû être mis à jour en 5.x ?

8 votes

La réponse correcte est @shipperizer ci-dessous. Passez plutôt à celery==4.1.1 . Si vous réglez kombu==4.1.0 vous rencontrerez à nouveau ce problème lorsque vous mettrez à jour celery au-delà de la version 4.1.0.

14voto

Geoff Points 432

Le céleri ne lie pas ses besoins en kombu et en billard à des versions spécifiques. Ils exigent ce qui suit :

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 a été publié avec un changement de rupture et les versions précédentes de celery l'installent automatiquement.

Puisque Celery n'épingle pas de versions spécifiques, vous devez épingler la version suivante si vous continuez à utiliser celery 4.1.0 :

kombu==4.1.0
billiard==3.5.0.2

2 votes

Devrait être billiard==3.5.0.2 . L'installation de Pip échouera avec 3.0.5.2 .

0 votes

Merci, j'ai configuré mon post deploy/fistboot script pour installer kombu==4.1.0 avant d'installer Celery.

11voto

吴毅凡 Points 679

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

kombu==4.2.0 renomme async a asynchronous le céleri l'a fixé dans celery==4.2.0rc4 .

Vous devez donc mettre à jour celery en 4.2.0rc4.

référer : https://github.com/celery/celery/commit/c8ef7ad60b72a194654c58beb04a1d65cd0435ad

0 votes

La version 4.1.1, qui est une version officielle, le corrige.

6voto

DYoung Points 771

C'était ça le problème, c'était en fait la version kombu.

J'ai réussi à faire installer 2 versions de kombu, 4.2.0 comme la 'appuser' sous lequel j'essayais de démarrer le travailleur, et 4.1.0 en tant que 'root' . La 4.1.0 comme 'root' fonctionnerait, l'autre utilisateur ne l'a pas fait.

J'ai supprimé kombu 4.2.0 de la liste de diffusion de la 'appuser' compte utilisateur (pip uninstall kombu en tant qu'utilisateur), afin d'utiliser le paquetage installé sur le système, et le travailleur Celery a fonctionné correctement sous ce compte.

Pour vérifier que c'est bien la version 4.2.0 de Kombu qui est en panne, j'ai supprimé la version 4.1.0 du système et j'ai laissé pip installer la dernière version, qu'il obtient en tant que 4.2.0, et le travailleur Celery a fait ce qui suit ne démarre plus . Je l'ai désinstallé et j'ai forcé pip à installer 4.1.0 ( pip install kombu==4.1.0) et le travailleur a fonctionné correctement.

Comme autre vérification, je suis allé sur mon Mac, où j'ai initialement écrit/testé ce code, et j'ai vérifié la version de kombu qui y est installée par pip : 4.1.0. Je ne sais pas pourquoi pip sur le Mac et le Pi3 a installé la version 4.1.0 de kombu alors que pip sur l'ODROID-C2 a installé la version 4.2.0. Je creuserai davantage si j'en ai l'occasion mais cela fonctionne maintenant.

0 votes

Parce que Kombu 4.2.0 est sorti quelques heures avant ce message. Je suppose que lorsque vous avez installé les paquets pip w/ root est une version antérieure à la version 4.2.0, et lors de l'installation de w/ appuser c'était après la sortie de la version 4.2.0, puisque comme @Daniel le dit, celery n'épingle pas la version, et installe simplement la dernière version <5.0.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X