2018-06-30-django-17-Celery

Celery简介

Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理

Celery的相关概念

task

​ 需要执行的任务

worker

​ 负责干活儿的小弟

broker

​ 任务队列(worker拿任务的地方)

backend

​ 干完活儿 结果存放的位置

Celery基本工作流程

celery工作流程图

Celery的安装与使用

安装

sudo pip install celery
sudo pip install celery-with-redis
sudo pip install django-celery
sudo apt install redis-server

配置

settings.py文件

ALLOWED_HOSTS = ['*']
INSTALLED_APPS = [
	  ...
	  'djcelery',
	  ‘自己的APP’
	]
#---celery.conf----
import djcelery
djcelery.setup_loader()
BROKER_URL="redis://127.0.0.1:6379/1"	#这里的1代表使用redis的哪个库
CELERY_CONCURRENCY=2    #(设置worker的并发数量)
CELERY_RESULT_BACKEND = "redis://127.0.0.1:6379/3"#---celery.conf----
import djcelery
djcelery.setup_loader()
BROKER_URL="redis://127.0.0.1:6379/1"
CELERY_CONCURRENCY=2    #(设置worker的并发数量)
CELERY_RESULT_BACKEND = "redis://127.0.0.1:6379/3"


#计划任务

CELERYBEAT_SCHEDULE={
    'every-two-seconds-run-create_data':{
        'task':'t9.tasks.create_data',
        'schedule':timedelta(seconds=2),
        'args':()
    },
    'every-week-three-run-get_data_with_param':{
        'task':'t9.tasks.get_data_with_param',
        'schedule':crontab(day_of_week="3,4"),
        'args':()
    }
}
#----day09\celery.py-----

from __future__ import absolute_import
from celery import Celery
from django.conf import settings
import os

#设置系统的环境配置用的是django的
os.environ.setdefault('DJANGO_SETTING_MODULE','day09.settings')

#实例化celery
app = Celery("mycelery")
app.conf.timezone="Asia/Shanghai"
#指定celery的配置来源
app.config_from_object("django.conf:settings")
#让celery 自动发现我们的task任务
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
#一定要注意,tasks.py文件不要写错,要不然找不到
#你需要在app目录下  新建一个叫tasks.py的文件

settings.py同级目录下的__init__.py加入

from __future__ import absolute_import
#绝对引用,位置必须在第一行
#python2需要这样写
from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app

使用

1、在需要使用异步任务的APP目录下新建tasks.py

#---------t9\tasks.py-----------------


import time
from celery import task
from django.http import HttpResponse
import random

from .models import MyData
#文件写入的基本都是task函数

@task
def get_data():
    #假装在查数据
    time.sleep(3)
    # return HttpResponse('我正在running  ok')
    print('我正在running  ok')

@task
def get_data_with_param(loop):
    for i in range(loop):
        time.sleep(2)
        print("我被第{}次执行了".format(i))


@task
def create_data():
    num = random.randrange(100)
    MyData.objects.create(data="{}".format(num))

2、views.py内的调用

#-------t9\views.py---------------------


#任务函数名.delay(参数,,,,)


from django.http import HttpResponse
from django.shortcuts import render

from t9.models import MyData
from .tasks import get_data,get_data_with_param,create_data
from .my_singals import action
# Create your views here.

def index(request):
    # get_data()
    # loop = 3
    # get_data_with_param.delay(loop)
    create_data()
    return HttpResponse("我是辅助")


def test_singal(request):
    # obj = MyData()
    # obj.data = "hehe"
    # obj.save()
    action.send(sender="dada",data="hahaha")
    return HttpResponse("ok")

3、python manage.py migrate 建表

4、启动worker python manage.py celery worker --loglevel=info

​ **** (或者celery -A 你的工程名 worker -l info)

注意修改tasks.py的时候要重启celery

5、注意也要启动你的django项目

python manage.py runserver 0:8000

定时任务

在settings.py文件添加
CELERYBEAT_SCHEDULE={
    'every-two-seconds-run-create_data':{
        'task':'t9.tasks.create_data',
        'schedule':timedelta(seconds=2),
        'args':()
    },
    'every-week-three-run-get_data_with_param':{
        'task':'t9.tasks.get_data_with_param',
        'schedule':crontab(day_of_week="3,4"),
        'args':()
    }
}

启动: celery -A 你的工程名称 beat -l info(或者python manage.py celery beat --loglevel=info)

计划任务时间

from celery.schedules import crontab
crontab(minute=u'00', hour=u'11',day_of_week='mon,tue,wed,thu,sun')

坑:

我们启动定时任务的时候

首先要开启worker

如果只开启定时任务,定时任务会被放入任务队列;

此时如果没有开启worker,那么任务是没有被执行的;

此时如果开启了worker,那么任务队列是有任务的,就去执行;(也就是说,就算你定时任务没开,无所谓,只要任务队列只要有任务,我就去执行)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值