详解配置Django的Celery异步之路踩坑


Posted in Python onNovember 25, 2018

人生苦短,我用python。

看到这句话的时候,感觉可能确实是很深得人心,不过每每想学学,就又止步,年纪大了,感觉学什么东西都很慢,很难,精神啊注意力啊思维啊都跟不上。今天奶牛来分享自己今天踩的一个坑。

先说说配置过程吧,初学Django,啥都不懂,当然,python也很水,啥东西都得现查现用。Django安装还是很简单的。

apt-get install python3
pip3 install django

嗯,就是两条命令的事儿。

再说celery的安装:

pip3 install celery
pip3 install redis==2.10.6

目前奶牛所在的时间redis for python的版本是redis-3.0.1,为什么要用2.10.6呢?因为3.0.1压根配置就无法运行!!!

继续安装redis server

apt-get install redis
service redis start

然后就可以按照celery的官方教程走了,放个URL:http://docs.celeryproject.org/en/latest/django/index.html

python3 manage.py startproject nenew
cd nenew
python3 manage.py startapp nenewapp
touch ./nenew/celery.py
touch ./nenewapp/tasks.py

然后增加nenew/nenew/celery.py内容为

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'nenew.settings')

app = Celery('nenew')

# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#  should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')

# Load task modules from all registered Django app configs.
app.autodiscover_tasks()


@app.task(bind=True)
def debug_task(self):
  print('Request: {0!r}'.format(self.request))

增加nenew/nenew/__init__.py的内容

from __future__ import absolute_import, unicode_literals

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

__all__ = ('celery_app',)

增加nenew/nenewtest/tasks.py的内容

# Create your tasks here
from __future__ import absolute_import, unicode_literals
from celery import shared_task


@shared_task
def add(x, y):
  return x + y


@shared_task
def mul(x, y):
  return x * y


@shared_task
def xsum(numbers):
  return sum(numbers)

在nenew/nenew/settings.py中增加和修改

...

ALLOWED_HOSTS = ['*']
....

INSTALLED_APPS = [
...
  'nenewtest',
]

...

CELERY_BROKER_URL = 'redis://localhost:6379/1'
CELERY_RESULT_BACKEND = ‘redis://localhost:6379/0'

在nenew/nenewtest/views.py中增加或修改为

from django.shortcuts import render
from django.http import HttpResponse
from .tasks import add
# Create your views here.
def nenewtest(request):
  result = add.delay('2','2')
  result.ready()
  return HttpResponse('nenew Django Celery worker run !')

最后把views添加到nenew/nenew/urls.py中

from django.contrib import admin
from django.urls import path
from nenewtest import views

urlpatterns = [
  path('admin/', admin.site.urls),
  path('test/', views.nenewtest),
]

然后在项目目录nenew执行

celery -A nenew worker -l info

这时候worker启动正常会显示:

-------------- <a href="/cdn-cgi/l/email-protection" rel="external nofollow" data-cfemail="2c4f4940495e556c424942495b">[email protected]</a> v4.2.1 (windowlicker)
---- **** -----
--- * ***  * -- Linux-4.15.0-39-generic-x86_64-with-Ubuntu-18.04-bionic 2018-11-23 17:31:25
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app:         nenew:0x7fdc5a155cc0
- ** ---------- .> transport:   redis://localhost:6379/1
- ** ---------- .> results:     redis://localhost:6379/0
- *** --- * --- .> concurrency: 1 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
 -------------- [queues]
                .> celery           exchange=celery(direct) key=celery

这样类似的信息,然后我们启动项目,这里需要新开一个shell:

python3 manage.py runserver 0:80

这样我们就可以通过80端口直接访问我们的web了。地址是http://locahost/test

当我们这里访问正常后,在worker界面会有

[2018-11-23 18:09:19,469: INFO/MainProcess] Received task: nenewtest.tasks.add[35faa0fe-dd48-4f8d-9559-516556a93a40]
[2018-11-23 18:09:19,470: INFO/ForkPoolWorker-1] Task nenewtest.tasks.add[35faa0fe-dd48-4f8d-9559-516556a93a40] succeeded in 0.00031037399821798317s: '22'

如下语句表示执行成功,这样子就表示通过Django的网页我们对celery任务的异步执行成功。

当然,按照我的方法是可以一步成功的,因为奶牛已经踩了一整天的坑了,被一个错误郁闷得不要不要的。

AttributeError: 'float' object has no attribute 'items'

就是这个错误,查遍国内的所有网站都没有结果,然后就去bing的国际版查,然后发现果然是有bug在啊,奶牛这一天浪费得可真是够了。

这是celery的一个issue,在地址https://github.com/celery/celery/issues/5175 ,issue里面提及在2018/11/22日 it's fixed in kombu and celery master。问题的根源是celery对redis3的支持不好,补救方法是

Solution: Roll back redis with pip: pip install redis==2.10.6

然后在commit里面找到是对requirements/extras/redis.txt文件进行版本限定。

-redis>=2.10.5
+redis>=2.10.5,<3

好了,踩坑总算结束了。毕竟是新手,很多问题可能就是潜意识认为是自己的代码有问题,实际。。。实际可能并不是这样子,得多关注源码的更迭和问题处理才好。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中如何使用朴素贝叶斯算法
Apr 06 Python
python实现分页效果
Oct 25 Python
Pytoch之torchvision.transforms图像变换实例
Dec 30 Python
pytorch 实现在一个优化器中设置多个网络参数的例子
Feb 20 Python
如何提高python 中for循环的效率
Apr 15 Python
Python自动化操作实现图例绘制
Jul 09 Python
零基础学Python之前需要学c语言吗
Jul 21 Python
django数据模型中null和blank的区别说明
Sep 02 Python
python 将html转换为pdf的几种方法
Dec 29 Python
python 写一个水果忍者游戏
Jan 13 Python
基于Python 函数和方法的区别说明
Mar 24 Python
numpy数据类型dtype转换实现
Apr 24 Python
利用Python如何实现一个小说网站雏形
Nov 23 #Python
Python + selenium + requests实现12306全自动抢票及验证码破解加自动点击功能
Nov 23 #Python
python+selenium实现自动抢票功能实例代码
Nov 23 #Python
3分钟学会一个Python小技巧
Nov 23 #Python
值得收藏,Python 开发中的高级技巧
Nov 23 #Python
python 常见字符串与函数的用法详解
Nov 23 #Python
django+mysql的使用示例
Nov 23 #Python
You might like
php下mysql数据库操作类(改自discuz)
2010/07/03 PHP
PHP+jQuery 注册模块开发详解
2014/10/14 PHP
学习php设计模式 php实现抽象工厂模式
2015/12/07 PHP
javascript 动态设置已知select的option的value值的代码
2009/12/16 Javascript
关于Aptana Studio生成自动备份文件的解决办法
2009/12/23 Javascript
javascript Window及document对象详细整理
2011/01/12 Javascript
jquery中实现标签切换效果的代码
2011/03/01 Javascript
js动画效果制件让图片组成动画代码分享
2014/01/14 Javascript
一款基于jQuery的图片场景标注提示弹窗特效
2015/01/05 Javascript
JavaScript字符串对象(string)基本用法示例
2017/01/18 Javascript
javascript笔记之匿名函数和闭包
2017/02/06 Javascript
angular ng-repeat数组中的数组实例
2017/02/18 Javascript
Vue.js 动态为img的src赋值方法
2018/03/14 Javascript
详解JavaScript 中 if / if...else...替换方式
2018/07/15 Javascript
深入浅出了解Node.js Streams
2019/05/27 Javascript
在Layui 的表格模板中,实现layer父页面和子页面传值交互的方法
2019/09/10 Javascript
Windows下安装 node 的版本控制工具 nvm
2020/02/06 Javascript
javascript 使用sleep函数的常见方法详解
2020/04/26 Javascript
原生小程序封装跑马灯效果
2020/10/21 Javascript
[03:42]2014DOTA2西雅图国际邀请赛 Navi战队巡礼
2014/07/07 DOTA
[06:07]DOTA2-DPC中国联赛 正赛 Ehome vs VG 选手采访
2021/03/11 DOTA
python3实现公众号每日定时发送日报和图片
2018/02/24 Python
Python字典的基本用法实例分析【创建、增加、获取、修改、删除】
2019/03/05 Python
浅谈Python中(&amp;,|)和(and,or)之间的区别
2019/08/07 Python
详解Python3 pickle模块用法
2019/09/16 Python
python实现控制台输出彩色字体
2020/04/05 Python
Python 捕获代码中所有异常的方法
2020/08/03 Python
英国最大的经认证的有机超市:Planet Organic
2018/02/02 全球购物
荷兰演唱会和体育比赛订票网站:viagogo荷兰
2018/04/08 全球购物
语文高效课堂实施方案
2014/05/03 职场文书
一般基层干部群众路线教育实践活动个人对照检查材料
2014/11/04 职场文书
入党积极分子考察意见
2015/06/02 职场文书
2015年工商局个人工作总结
2015/07/23 职场文书
2016年领导干部正风肃纪心得体会
2015/10/09 职场文书
MySQL root密码的重置方法
2021/04/21 MySQL
i7 6700处理器相当于i5几代
2022/04/19 数码科技