前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django 2.1.7 Celery 4.3.0 示例,解决Task handler raised error: ValueError('not enough values to unp...

Django 2.1.7 Celery 4.3.0 示例,解决Task handler raised error: ValueError('not enough values to unp...

作者头像
Devops海洋的渔夫
发布2019-08-02 10:46:01
7730
发布2019-08-02 10:46:01
举报
文章被收录于专栏:Devops专栏

原文地址:Django 2.1.7 Celery 4.3.0 使用示例,解决Task handler raised error: ValueError('not enough values to unp...


Celery - 分布式任务队列

简介:

Celery 是一个简单、灵活且可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必需工具。

它是一个专注于实时处理的任务队列,同时也支持任务调度。

使用情景:用户发起request,并等待response返回。在某些views中,可能需要执行一段耗时的程序,那么用户就会等待很长时间,造成不好的用户体验,比如发送邮件、手机验证码等。

使用celery后,情况就不一样了。

解决:将耗时的程序放到celery中执行。

celery名词:

  • 任务task:就是一个Python函数。
  • 队列queue:将需要执行的任务加入到队列中。
  • 工人worker:在一个新进程中,负责执行队列中的任务。
  • 代理人broker:负责调度,需要提前部署好redis。

安装包:

代码语言:javascript
复制
pip3 install celery==4.3.0
pip3 install django-celery==3.3.0

示例

1)在assetinfo/views.py文件中创建视图sayhello。

代码语言:javascript
复制
import time
...
def sayhello(request):
    print('hello ...')
    time.sleep(2)
    print('world ...')
    return HttpResponse("hello world")

2)在assetinfo/urls.py中配置。

代码语言:javascript
复制
urlpatterns = [
    # ex:/assetinfo/sayhello
    path('sayhello', views.sayhello, name='sayhello'),
]

3)启动服务器,在浏览器中输入如下网址:

http://127.0.0.1:8000/assetinfo/sayhello

4)由于视图设置了sleep 2秒,导致浏览器过了2秒之后才访问完成。

5)在项目/settings.py中安装。

代码语言:javascript
复制
INSTALLED_APPS = (
  ...
  'djcelery',
}

6)创建celery_tasks的包文件,专门存放tasks.py任务脚本

7)在celery_tasks目录下创建tasks.py文件。

代码语言:javascript
复制
from celery import Celery
import time

# 创建一个Celery类的实例对象
app = Celery('celery_tasks.tasks', broker='redis://127.0.0.1:6379/8')

@app.task
def async_sayhello():
    print('hello ...')
    time.sleep(2)
    print('world ...')

8)打开assetinfo/views.py文件,修改sayhello视图如下:

代码语言:javascript
复制
from celery_tasks.tasks import async_sayhello

def sayhello(request):
    # print('hello ...')
    # time.sleep(2)
    # print('world ...')
    async_sayhello.delay()
    return HttpResponse("hello world")

9)执行迁移生成celery需要的数据表。

代码语言:javascript
复制
python3 manage.py migrate

生成表如下:

10)启动Redis,如果已经启动则不需要启动。

代码语言:javascript
复制
[root@server01 ~]# ps -ef | grep redis
root      3694  3462  0 00:41 pts/4    00:00:00 grep --color=auto redis
root     31054     1  0 Jun27 ?        01:12:52 ./redis-server 127.0.0.1:6379
[root@server01 ~]# redis-cli 
127.0.0.1:6379> 

11)启动worker。

celery -A celery_tasks.tasks worker --loglevel=info

12 )再次访问url ,celery执行报错。

http://127.0.0.1:8000/assetinfo/sayhello

查看报错如下:

代码语言:javascript
复制
[2019-08-01 00:16:03,062: ERROR/MainProcess] Task handler raised error: ValueError('not enough values to unpack (expected 3, got 0)')
Traceback (most recent call last):
  File "g:\python3\python371\lib\site-packages\billiard\pool.py", line 358, in workloop
    result = (True, prepare_result(fun(*args, **kwargs)))
  File "g:\python3\python371\lib\site-packages\celery\app\trace.py", line 544, in _fast_trace_task
    tasks, accept, hostname = _loc
ValueError: not enough values to unpack (expected 3, got 0)

经过查阅资料,发现这是高版本celery运行在win10存在的问题。

13 ) 解决报错

解决:

原网页:Unable to run tasks under Windows

看别人描述大概就是说win10上运行celery4.x就会出现这个问题,解决办法如下,原理未知:

先安装一个eventlet

代码语言:javascript
复制
pip3 install eventlet

然后启动worker的时候加一个参数,如下:

代码语言:javascript
复制
celery -A <mymodule> worker -l info -P eventlet

正式执行,如下:

代码语言:javascript
复制
(venv) F:\pythonProject\django-pratice>celery -A celery_tasks.tasks worker -l info -P eventlet

 -------------- celery@USC2VG2F9NPB650 v4.3.0 (rhubarb)
---- **** -----
--- * ***  * -- Windows-10-10.0.17763-SP0 2019-08-01 00:22:21
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app:         celery_tasks.tasks:0x1e4a24170f0
- ** ---------- .> transport:   redis://127.0.0.1:6379/8
- ** ---------- .> results:     disabled://
- *** --- * --- .> concurrency: 12 (eventlet)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
 -------------- [queues]
                .> celery           exchange=celery(direct) key=celery


[tasks]
  . celery_tasks.tasks.async_sayhello

[2019-08-01 00:22:21,629: INFO/MainProcess] Connected to redis://127.0.0.1:6379/8
[2019-08-01 00:22:21,700: INFO/MainProcess] mingle: searching for neighbors
[2019-08-01 00:22:22,913: INFO/MainProcess] mingle: all alone
[2019-08-01 00:22:23,012: INFO/MainProcess] celery@USC2VG2F9NPB650 ready.
[2019-08-01 00:22:23,045: INFO/MainProcess] pidbox: Connected to redis://127.0.0.1:6379/8.

再次访问http://127.0.0.1:8000/assetinfo/sayhello

执行任务成功,如下:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.08.01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Celery - 分布式任务队列
  • 示例
  • 解决:
相关产品与服务
云数据库 Redis®
腾讯云数据库 Redis®(TencentDB for Redis®)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档