按照Celery的官方文档,开始学习最简单的示例add,结果Celery worker收到任务后就报错了,错误堆栈如下:
[2018-03-21 09:43:23,123: INFO/SpawnPoolWorker-2] child process 4404 calling sel
f.run()
[2018-03-21 09:43:23,207: INFO/SpawnPoolWorker-3] child process 7432 calling sel
f.run()
[2018-03-21 09:43:24,688: INFO/MainProcess] Received task: tasks.add[277ba2c5-31
0f-459b-a396-b895400d4c3e]
[2018-03-21 09:43:24,695: ERROR/MainProcess] Task handler raised error: ValueErr
or('need more than 0 values to unpack',)
Traceback (most recent call last):
File "E:\Python34\lib\site-packages\billiard\pool.py", line 358, in workloop
result = (True, prepare_result(fun(*args, **kwargs)))
File "E:\Python34\lib\site-packages\celery\app\trace.py", line 518, in _fast_t
race_task
tasks, accept, hostname = _loc
ValueError: need more than 0 values to unpack
经过Google搜索,发现在Windows下运行就会出现此问题,参见官方Issue
解决办法就是运行Celery worker的时候,指定参数'-P eventlet', 这个参数用于指定worker的运行模式,默认为prefork,这是使用eventlet也就意味着使用协程。