Celery引发了ValueError:没有足够的值来解压缩

时间:2017-08-17 21:07:56

标签: python celery

尝试使用Celery运行简单示例并接收异常。 RabbitMQ在Docker中启动,也尝试在本地启动它。 Celery在本地Windows主机上运行

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()

我的错误文字摘录:

[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)

5 个答案:

答案 0 :(得分:27)

driver.switch_to_default_content()尚未正式支持Windows。但它仍可在Windows上用于某些开发/测试目的。

使用Celery 4.0+代替如下:

eventlet

它适用于我pip install eventlet celery -A <module> worker -l info -P eventlet + Windows 10 + celery 4.1

=====更新2018-11 =====

Eventlet在subprocess.CalledProcessError上有一个问题:

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

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

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

请改为尝试python 3

gevent

这适用于pip install gevent celery -A <module> worker -l info -P gevent + Windows 10 + celery 4.2

答案 1 :(得分:3)

对我有用:

celery -A my_project_name worker --pool=solo -l info

基本上,事情变成了单线程并被支持

答案 2 :(得分:2)

哪个芹菜版?据我所知,从芹菜4开始,芹菜在窗户中不受支持

答案 3 :(得分:2)

适用于Windows上的Celery 4.1

设置环境变量FORKED_BY_MULTIPROCESSING=1。然后,您只需运行celery -A <celery module> worker即可。

答案 4 :(得分:0)

我在Windows 7 32位系统上收到此错误。所以我这样做是为了使其正常工作。

添加此

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

在django项目的myproj/settings.py文件中定义芹菜实例之前。

它应该像

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')

我将redis用作如此定义的消息代理broker='redis://127.0.0.1:6379/0'