win运行celery的,解决ValueError: not enough values to unpack (expected 3, got 0) 2019-08-26

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了win运行celery的,解决ValueError: not enough values to unpack (expected 3, got 0) 2019-08-26相关的知识,希望对你有一定的参考价值。

参考技术A 1.在window上celery4.0以上不支持windows,如果要支持需要手动安卓eventlet
celery worker -A celery_app_task -l info -P eventlet
2.运行时发现还是不能提交任务

所以需要再后面增加一个 -E 用来启动
完整命令:
celery worker -A celery_app_task -l info -P eventlet -E
成功启动如下

测试:

Win10下Celery4.2.1基于redis的部署与错误

Celery是一个分布式异步任务的神器,由Python开发但是其通信协议可以支持其它语言。它还可以设置定时任务,设置多个任务队列并路由任务到指定的队列;同时还提供了运行时的一些监控和管理接口。

安装

  • 安装python3.7(官网下载直接安装)
  • 安装celery库(pip install celery)
  • 安装redis库(pip install redis)

配置\\启动worker

安装完成之后就可以配置celery的测试代码了。首先是clelry的运行配置文件celeryconfig.py(当然你也可以从命令行传入)

BROKER_URL = 'redis://pcma.xxx.com:6379/0'
CELERY_RESULT_BACKEND = 'redis://pcma.xxx.com:6379/0'

CELERY_REDIS_MAX_CONNECTIONS = 4
CELERYD_CONCURRENCY = 4
BROKER_TRANSPORT_OPTIONS = 'visibility_timeout': 5    # 5min

CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ACCEPT_CONTENT = ['json']  # Ignore other content
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERY_ENABLE_UTC = True

接着创建celery的worker代码,celery_worker.py

from celery import Celery

app = Celery('celery_work')
app.config_from_object('celeryconfig')

@app.task
def add(x, y):
    return x + y

然后我们就可以启动worker服务了,此后该worker会一直等待任务并执行。具体启动命令如下:

celery -A celery_server worker --loglevel=info

这种方式默认是多进程启动worker。如果你希望使用单进程启动的话,命令如下:

celery -A celery_server worker --loglevel=info -P solo

另外,你还可以使用协程的方式启动。当然首先你需要安装eventlet。(pip install eventlet)

celery -A celery_server worker --loglevel=info -P eventlet

任务调用

worker启动就绪之后,我们要做的事情就是添加要执行的任务。具体代码如下:

from celery_worker import add

result = add.delay(4, 4)

如果你希望能获取到执行的结果,如下接口可以满足你的需求:

result.ready()    # 获取任务执行状态
result.get(timeout=1, propagate=False)    # 获取任务执行结果
result.traceback    # 获取任务执行异常时的堆栈信息

注意:如果你需要获取任务的结果,那边就需要配置CELERY_RESULT_BACKEND选项。否则celery不会存储结果。

问题及解决

由于安装的是celery4.2.1的版本。其中有2个bug需要针对性的解决。

  1. Python 3.7 syntax error: async is a reserved keyword #4849
  2. Unable to run tasks under Windows #4081

第1个是因为async在Python3.7已经是关键字了,但是celery版本没有更新导致的。下一个发布版本中会修复。没有新版本之前,我们只要修改celery文件中的async为另外的字符即可。比如我修改为了async_2。(注意定义和引用需要修改全套的)

第2个是因为windows下没有fork多进程的模块,而celery默认启动方式就是多进程的,并且还用了fork的方式。解决方式有多种:

  • 使用单进程启动方式(上面已列出,另注意CELERYD_CONCURRENCY配置项取消)
  • 在创建celery实例之前,配置系统环境变量。os.environ.setdefault('FORKED_BY_MULTIPROCESSING', '1')
  • 使用协程的方式启动(上面已列出)

问题描述

问题1:

  File "celery/backends/redis.py", line 22
    from . import async, base
                      ^
SyntaxError: invalid syntax

问题2:

[2017-06-08 15:31:49,416: ERROR/MainProcess] Task handler raised error: ValueError('not enough values to unpack (expected 3, got 0)',)
Traceback (most recent call last):
File "c:\\program files\\python36\\lib\\site-packages\\billiard\\pool.py", line 359, in workloop
result = (True, prepare_result(fun(*args, **kwargs)))
File "c:\\program files\\python36\\lib\\site-packages\\celery\\app\\trace.py", line 518, in _fast_trace_task
tasks, accept, hostname = _loc
ValueError: not enough values to unpack (expected 3, got 0)

了解更多关于测试与Python的文章,请关注testQna公众号!

以上是关于win运行celery的,解决ValueError: not enough values to unpack (expected 3, got 0) 2019-08-26的主要内容,如果未能解决你的问题,请参考以下文章

Django celery 4 - ValueError: int() 的无效文字,当启动 celery worker 时,基数为 10

windows上运行celery4.x就会出现问题

Django - Celery ValueError:无法解析相关模型 u'user.User'

celery 启用worker ValueError: not enough values to unpack

celery正常启动后能收到任务但不执行任务的解决办法

celery接收到任务后出现错误,ValueError: not enough values to unpack (expected 3, got 0)