django+celery+redis实现异步、定时任务(搭建后记录)

一、安装

注意:包的版本方面有要求,不然搭建好后运行会报错,以下是本次使用版本,可运行

1.pip安装 celery==3.1.20,django-celery==3.3.1, redis==2.8.0,redis版本安装在3以下(使用此套发现定时任务cpu占用大)

2. 发现cpu大的话,django-celery降到django-celery==3.2.2

二、配置及编写测试文件

 

1. 在与settings平级的目录下,新建celery.py文件

# !/usr/bin/env python
# encoding: utf-8
# 目的是拒绝隐式引入,celery.py和celery冲突。
from __future__ import absolute_import ,unicode_literals

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


# 设置环境变量
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "opetation.settings")  # 改项目名

# 创建celery应用
app = Celery('opetation')    # 名称可随意更改
app.config_from_object('django.conf:settings')

# 如果在工程的应用中创建了tasks.py模块,那么Celery应用就会自动去检索创建的任务。比如你添加了一个任务,在django中会实时地检索出来。
app.autodiscover_tasks(lambda :settings.INSTALLED_APPS)


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



2. app应用下创建tasks.py,当apps下有多个app应用时,每个app下都可以创建tasks.py,如上所说,会自动检索

tasks.py内容

# !/usr/bin/env python
# encoding: utf-8

from __future__ import absolute_import

import datetime
import time
import traceback

from celery import shared_task, platforms

platforms.C_FORCE_ROOT = True  # 若执行时报错root用户不能执行,加上这一行

@shared_task
def test(x, y):
    print
    time.sleep(5)
    return "end:结果-%s" % (x + y)

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

@shared_task
def send_message():
    print "执行send_message......"
    now_str = datetime.datetime.now().__str__()
    print "当前执行时间:{}".format(now_str)

问题解决:使用python3+django2.0时,异步时,不进入异步函数

方案:将@shared_task改为@app.task后重启解决,注意app导包,导入上面第一步,新建的celery.py文件中的app

3. settings.py中配置

from __future__ import absolute_import   # 防止celery.py与celery冲突

from celery.schedules import crontab
from celery.schedules import timedelta

# celery配置
import djcelery
djcelery.setup_loader()
CELERY_TIMEZONE='Asia/Shanghai'     # TIME_ZONE配置保持一致
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'   # celery处理器

BROKER_BACKEND='redis'
BROKER_URL='redis://localhost:6379/1'
CELERY_RESULT_BACKEND='redis://localhost:6379/2'


# 定时周期任务的配置
CELERYBEAT_SCHEDULE = {
    "send_message":{
        "task":"app.tasks.send_message",             # app名.tasks.方法名
        "schedule":timedelta(seconds=10)             # 每隔10秒执行
    },
    "test_task": {
        "task": "app.tasks.test",
        "schedule": crontab(hour=11, minute=28)      # 每天的11点28分执行一次任务
    }
}

4. 异步的使用,在view.py中编写逻辑,配置urls路由后,访问使用

5. 命令及运行查看

# 异步执行
# python manage.py  celery worker -c 6 -l debug

# 定时执行,可能会报错没有beat_table表, 执行python manage.py migrate
# python manage.py celery beat -l INFO

若有报错,可上网搜索,基本都能找到解决方案。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值