27 votes

Celery soulève une ValueError : il n'y a pas assez de valeurs à décompresser

J'essaie d'exécuter un exemple simple avec Celery et je reçois une exception. RabbitMQ a démarré dans un Docker, j'ai également essayé de le démarrer localement. Celery fonctionne sur un hôte Windows local

from celery import Celery

app = Celery('tasks', broker='amqp://192.168.99.100:32774')

@app.task()
def hello():
    print('hello')

if __name__ == '__main__':
    hello.delay()

Extrait de mon texte d'erreur :

[2017-08-18 00:01:08,628: INFO/MainProcess] Received task: tasks.hello[8d33dbea-c5d9-4938-ab1d-0646eb1a3858] [2017-08-18 00:01:08,632: ERROR/MainProcess] Task handler raised error: ValueError('not enough values to unpack (expected 3, got 0)',) Traceback (most recent call last): File "c:\users\user\celenv\lib\site-packages\billiard\pool.py", line 358, in workloop result = (True, prepare_result(fun(*args, **kwargs))) File "c:\users\user\celenv\lib\site-packages\celery\app\trace.py", line 525, in _fast_trace_task tasks, accept, hostname = _loc ValueError: not enough values to unpack (expected 3, got 0)

96voto

Samuel Chen Points 586

Celery 4.0+ n'est pas encore officiellement compatible avec Windows. Mais il fonctionne toujours sous Windows à des fins de développement/test.

Utilice eventlet comme indiqué ci-dessous :

pip install eventlet
celery -A <module> worker -l info -P eventlet

Il fonctionne pour moi sur Windows 10 + celery 4.1 + python 3 .

\===== update 2018-11 =====

Eventlet a un problème sur subprocess.CalledProcessError :

https://github.com/celery/celery/issues/4063

https://github.com/eventlet/eventlet/issues/357

https://github.com/eventlet/eventlet/issues/413

Essayez donc gevent au lieu de cela.

pip install gevent
celery -A <module> worker -l info -P gevent

Cela fonctionne pour moi sur Windows 10 + celery 4.2 + python 3.6

17voto

J'ai obtenu cette erreur sur le système Windows 7 32bit. J'ai donc fait ceci pour que cela fonctionne.

Ajouter

`os.environ.setdefault('FORKED_BY_MULTIPROCESSING', '1')` 

avant de définir une instance de celery dans myproj/settings.py dans votre projet django.

Il devrait ressembler à

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproj.settings')
os.environ.setdefault('FORKED_BY_MULTIPROCESSING', '1')

app = Celery('tasks', broker='redis://127.0.0.1:6379/0')

J'utilise redis comme courtier de messagerie, ainsi défini broker='redis://127.0.0.1:6379/0'

12voto

bmjjr Points 1305

Pour Celery 4.1 sous Windows.

Définir une variable d'environnement FORKED_BY_MULTIPROCESSING=1 . Il vous suffit ensuite de lancer celery -A <celery module> worker .

7voto

ItayB Points 148

Quelle version de celery ? pour autant que je me souvienne celery n'est plus supporté par Windows depuis celery 4

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