异步任务 ---- django-celery

 

大家的知道celery的使用,网上也有很多的教程。因为最近在使用django来完成项目,无意间发现发现有个东西叫django-celery,比celery的配置更加的简单,这里分享一下。

首先需要统一一下使用的环境,以为如果redis的版本过高会报错

推荐版本  

  Django == 2.2.6

  django-celery == 3.3.1

  django-redis == 4.11.0

  redis == 2.10.6

  celery == 3.1.26.post2

配置settings.py

  因为本机直接有redis,在这里我们直接使用redis作为我们的broker。当然,如果你追求稳定性和效率,也可使使用rabbitMQ或者kafka。  

#settings.py

import djcelery djcelery.setup_loader()
BROKER_URL = 'redis://127.0.0.1:6379/2' INSTALLED_APPS = [
...
"djcelery",
... ]

  创建Celery所需的数据表

python manage.py migrate
#如若不成功可以尝试一下命令语句
#python manage.py syncdb

创建task

  在app里建立tasks.py文件来写入需要执行的异步任务

a、当settings.py中的djcelery.setup_loader()运行时, Celery便会查看所有INSTALLED_APPS中app目录中的tasks.py文件, 找到标记为task的function, 并将它们注册为celery task.

  b、在执行djcelery.setup_loader()时, task是以INSTALLED_APPS中的app名, 加.tasks.function_name注册的

  c、一次需要注意 在impprt task时, 需要保持一致

  d、如果我们由于python path不同而使用不同的引用方式时(例如在tasks.py中使用from myproject.myapp.tasks import add形式), Celery将无法得知这是同一task, 因此可能会引起奇怪的bug。
 

让任务变成异步

  例如我们希望在用户发出request后异步执行该task, 马上返回response, 从而不阻塞该request, 使用户有一个流畅的访问过程. 那么, 我们可以使用.delay。

 Views.py

# -*- coding: utf-8 -*-
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
from syl.settings import ALY_ACCESSKEY_ID,ALY_ACCESSKEY_SECRET
import json,time
from celery import task @task
def send_sms(phone,data): client = AcsClient(ALY_ACCESSKEY_ID,
ALY_ACCESSKEY_SECRET,
'cn-hangzhou') request = CommonRequest()
request.set_accept_format('json')
request.set_domain('dysmsapi.aliyuncs.com')
request.set_method('POST')
request.set_protocol_type('https') # https | http
request.set_version('2017-05-25')
request.set_action_name('SendSms') request.add_query_param('RegionId', "cn-hangzhou")
request.add_query_param('PhoneNumbers',phone)
request.add_query_param('SignName', "美多商城")
request.add_query_param('TemplateCode', "SMS_205402983")
request.add_query_param('TemplateParam',data) response1 = client.do_action(request)
# python2: print(response)
print(str(response1, encoding='utf-8'))
res = json.loads(str(response1,encoding='utf-8'))
time.sleep(5)

verifications/tasks.py

启动celery

  首先正常启动你的django任务,然后启动celery服务即可。

python manage.py celery worker --loglevel=info

  如果报错不让超级管理员来启动,在settings.py加入以下配置

from celery import Celery, platforms
platforms.C_FORCE_ROOT = True

验证celery任务

  在搞定上面的东西以后,你就可以通过postman来请求接口让接口使用celery来异步执行任务而不阻塞你的request请求。

注意

celery与3.7版本兼容问题
在 celery 官方的提议下,建议将 async 文件的文件名改成 asynchronous

Python37\Lib\site-packages\kombu\async

需要修改的文件
Python37\Lib\site-packages\celery\utils\timer2.py

Python37\lib\site-packages\celery\concurrency\asynpool.py

Python37\lib\site-packages\celery\worker\components.py

Python37\lib\site-packages\celery\worker\autoscale.py

Python37\lib\site-packages\celery\worker\consumer.py

  

 
 
 

异步任务-----django-celery的更多相关文章

  1. Django 异步化库celery和定时任务

    首先要了解Django其实是个同步框架,那么多个用户发送请求时就会发生排队的情况上一个用户的请求完成后在进行下一个,这样会对影响用户体验,所有就要用到异步方法来解决. 首先我们要安装celery库 p ...

  2. django celery异步框架

    描述:实现运维平台的异步执行与定时任务,以下简单描述了安装过程及使用.   安装django和celery pip install django pip install celery pip inst ...

  3. Django+Celery+xadmin实现异步任务和定时任务

    Django+Celery+xadmin实现异步任务和定时任务 关注公众号"轻松学编程"了解更多. 一.celery介绍 1.简介 [官网]http://www.celerypro ...

  4. 异步任务利器Celery(一)介绍

    django项目开发中遇到过一些问题,发送请求后服务器要进行一系列耗时非常长的操作,用户要等待很久的时间.可不可以立刻对用户返回响应,然后在后台运行那些操作呢? crontab定时任务很难达到这样的要 ...

  5. django celery redis 定时任务

    0.目的 在开发项目中,经常有一些操作时间比较长(生产环境中超过了nginx的timeout时间),或者是间隔一段时间就要执行的任务. 在这种情况下,使用celery就是一个很好的选择.   cele ...

  6. django+celery+redis实现运行定时任务

    0.目的 在开发项目中,经常有一些操作时间比较长(生产环境中超过了nginx的timeout时间),或者是间隔一段时间就要执行的任务. 在这种情况下,使用celery就是一个很好的选择.   cele ...

  7. django & celery - 关于并发处理能力和内存使用的小结

    背景 众所周知,celery 是python世界里处理分布式任务的好助手,它的出现结合赋予了我们强大的处理异步请求,分布式任务,周期任务等复杂场景的能力. 然鹅,今天我们所要讨论的则是如何更好的在使用 ...

  8. Django + Celery 实现动态配置定时任务

    哈喽,今天给大家分享一篇Django+Celery实现动态配置定时任务,因为最近也是无意间看到一位大佬关于这块的文章,然后自己觉得不错,也想学习写一下,然后最终实现功能是在前端页面统一管理计划任务,大 ...

  9. django+celery+redis环境搭建

    初次尝试搭建django+celery+redis环境,记录下来,慢慢学习~ 1.安装apache 下载httpd-2.0.63.tar.gz,解压tar zxvf httpd-2.0.63.tar. ...

  10. 基于Django+celery二次开发动态配置定时任务 ( 一 )

    需求: 前端时间由于开发新上线一大批系统,上完之后没有配套的报表系统.监控,于是乎开发.测试.产品.运营.业务部.财务等等各个部门就跟那饥渴的饿狼一样需要 各种各样的系统数据满足他们.刚开始一天一个还 ...

随机推荐

  1. 微信小程序简单封装图片上传组件

    微信小程序简单封装图片上传组件 希望自己 "day day up" -----小陶 我从哪里来 在写小程序的时候需要上传图片,个人觉得官方提供的 Uploader 组件不是太好用, ...

  2. Spring Cloud 纯干货,从入门到实战

    导读 之前写过一篇SpringCloud从入门到精通的点我直达,微服务基础知识点我直达,今天我们使用Spring Cloud模拟一个电商项目.分别有以下2个服务,商品.订单.下面我们开始叭 技术栈 S ...

  3. php 批量脚本检测语法错误

    shell 根据参数检测 当前php项目下 的语法错误 #!/bin/bash function getdir(){ for el in `ls $1` do dir_file=$1"/&q ...

  4. 服务网格istio概念应知应会

    一.背景 最近架构组基于istio开发了服务网格(Service Mesh)平台,借此机会把相关的背景知识做一次学习和记录,方便回头查看. 初版的效果: 二.istio 官方手册:https://is ...

  5. Unbuntu 18.04 LTS 环境下Python安装GDAL组件

    Unbuntu 18.04 LTS 环境下Python安装GDAL组件 // 非必要 sudo add-apt-repository ppa:ubuntugis/ppa sudo apt-get up ...

  6. 利用sklearn实现k-means

    基于上面的一篇博客k-means利用sklearn实现k-means #!/usr/bin/env python # coding: utf-8 # In[1]: import numpy as np ...

  7. Pandas_工资集处理

    import numpy as np import pandas as pd from pandas import Series,DataFrame # 1--读取数据文件 file_obj=open ...

  8. JavaScript探秘:可执行的上下文堆栈

    这一系列的文章,挺不错的,值得收藏细读 JavaScript探秘:可执行的上下文堆栈

  9. 域渗透之ldap协议

    LDAP(Light Directory Access Protocal)是一个基于X.500标准的轻量级目录访问协议,LDAP是支持跨平台的Internet协议,只需要通过LDAP做简单的配置就可以 ...

  10. python之对元组的初步了解

    元组: 元组与列表类似但是又有不同,主要的不同就是元组属于不可变序列,一旦创建,任何方法都不可以修改元素. 元组使用小括号( )表示,这与列表不一样,列表是用方括号表示[ ]. a=('a','b') ...