一、安装

pip install celery

pip install django-celery-beat

pip install django-celery-results

pip install redis

安装这4个库

pip list

celery==4.3.0
django-celery-beat==1.5.0
django-celery-results==1.1.2
redis==3.2.1

1、请注意不是django-celery、django-redis、celery-with-redis等库

以前版本的Celery需要一个单独的库来与Django一起工作

但是自从3.1以后就不再是这样了

Django现在支持开箱即用

2、在每个需要用到Celery的文件的第一行加上

from __future__ import absolute_import, unicode_literals

二、配置Celery

1、在项目demo/settings.py文件下加入:

'django_celery_beat',
# django-celery-beat 'django_celery_results',
# django-celery-results
CELERY_ENABLE_UTC = False
# 不使用国际标准时间
CELERY_TIMEZONE = 'Asia/Shanghai'
# 使用亚洲/上海时区
DJANGO_CELERY_BEAT_TZ_AWARE = False
# 解决时区问题
CELERY_BROKER_URL = 'redis://:Abcdef@123456@192.168.1.102:6379/0'
# redis://:password@hostname:port/db_number
CELERY_BROKER_TRANSPORT = 'redis'
# 使用redis作为中间件
CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'
# 自定义调度类,使用Django的ORM
CELERY_RESULT_BACKEND = 'django-db'
# 任务结果,使用Django的ORM
CELERY_ACCEPT_CONTENT = ['application/json']
# 设置任务接收的序列化类型
CELERY_TASK_SERIALIZER = 'json'
# 设置任务序列化方式
CELERY_RESULT_SERIALIZER = 'json'
# 设置结果序列化方式

2、在项目demo目录下新建celery.py文件:

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery, platforms
from django.utils.datetime_safe import datetime os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'demo.settings')
# 设置默认celery命令行的环境变量 app = Celery('demo')
# 实例化celery app.now = datetime.now
# 解决时区问题 app.config_from_object('django.conf:settings', namespace='CELERY')
# 直接从Django设置中配置Celery app.autodiscover_tasks()
# 从所有应用中加载任务模块tasks.py platforms.C_FORCE_ROOT = True
# 解决celery不能root用户启动的问题

3、在项目demo/__init__.py文件加入:

(请注意不是应用的__init__.py)

from __future__ import absolute_import, unicode_literals
from demo.celery import app as celery_app import pymysql __all__ = ('celery_app',) pymysql.install_as_MySQLdb()

4、在应用product目录下面新建tasks.py文件:

# Create your tasks here
from __future__ import absolute_import, unicode_literals from demo.celery import app @app.task
def debug_1():
print("调试_1已运行!") @app.task
def debug_2():
print("调试_2已运行!")

5、在应用product目录下面product/admin.py文件加入:

from django_celery_beat.models import IntervalSchedule, CrontabSchedule, ClockedSchedule, SolarSchedule, PeriodicTask
from django_celery_results.models import TaskResult
class IntervalScheduleAdmin(object):
list_display = [
'id', 'every', 'period',
]
ordering = ['id']
search_fields = ['every']
list_per_page = 10 class CrontabScheduleAdmin(object):
list_display = [
'id', 'minute', 'hour',
'day_of_week', 'day_of_month', 'month_of_year', 'timezone'
]
ordering = ['id']
search_fields = ['minute']
list_per_page = 10 class SolarScheduleAdmin(object):
list_display = [
'id', 'event', 'latitude', 'longitude'
]
ordering = ['id']
search_fields = ['event']
list_per_page = 10 class ClockedScheduleAdmin(object):
list_display = [
'id', 'clocked_time', 'enabled'
]
ordering = ['id']
search_fields = ['clocked_time']
list_per_page = 10 class PeriodicTaskAdmin(object):
list_display = [
'id', 'name', 'task', 'args', 'kwargs', 'queue',
'exchange', 'routing_key', 'expires', 'enabled',
'last_run_at', 'total_run_count', 'date_changed', 'description',
'interval', 'crontab', 'solar', 'clocked', 'one_off',
'start_time', 'priority', 'headers'
]
ordering = ['id']
search_fields = ['name']
list_per_page = 10 class TaskResultAdmin(object):
list_display = [
'id', 'task_id', 'status', 'content_type', 'content_encoding',
'result', 'date_done', 'traceback', 'hidden', 'meta',
'task_args', 'task_kwargs', 'task_name'
]
ordering = ['id']
search_fields = ['task_id']
list_per_page =
xadmin.site.register(IntervalSchedule, IntervalScheduleAdmin)
# 间隔时间表
xadmin.site.register(CrontabSchedule, CrontabScheduleAdmin)
# 定时时间表
xadmin.site.register(SolarSchedule, SolarScheduleAdmin)
# 太阳时间表
xadmin.site.register(ClockedSchedule, ClockedScheduleAdmin)
# 计时时间表
xadmin.site.register(PeriodicTask, PeriodicTaskAdmin)
# 配置任务 xadmin.site.register(TaskResult, TaskResultAdmin)
# 任务结果

6、 如果你用的是Django原生的admin,而不是xadmin,那么可以忽略第5步

原生的admin后台是这样的:

三、迁移数据库

(没有静态资源文件,也不用激活模型)

python manage.py migrate

可以看到数据库新增了这几张表

四、Web后台

(如果是原生的admin会有一个已经注册的任务的下拉框)

五、启动Celery

开2个终端到项目的根目录下分别执行

celery -A demo worker -l info

启动任务执行单元Worker

celery -A demo beat -l info

启动心跳

(也可以把这2个命令加入到Supervisor守护进程里面)

控制台日志

Web后台

xadmin引入celery4.0执行异步任务与定时任务的更多相关文章

  1. Django+Celery 执行异步任务和定时任务

    celery是一个基于python开发的简单.灵活且可靠的分布式任务队列框架,支持使用任务队列的方式在分布式的机器/进程/线程上执行任务调度.采用典型的生产者-消费者模型,主要由三部分组成: 1. 消 ...

  2. celery执行异步任务和定时任务

    一.什么是Clelery Celery是一个简单.灵活且可靠的,处理大量消息的分布式系统 专注于实时处理的异步任务队列 同时也支持任务调度 Celery架构 Celery的架构由三部分组成,消息中间件 ...

  3. Django配置celery执行异步任务和定时任务

    原生celery,非djcelery模块,所有演示均基于Django2.0 celery是一个基于python开发的简单.灵活且可靠的分布式任务队列框架,支持使用任务队列的方式在分布式的机器/进程/线 ...

  4. Combine 框架,从0到1 —— 4.在 Combine 中执行异步代码

    本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 4.在 Combine 中执行异步代码. 内容概览 前言 用 Future 取代回调闭包 用输出类型( ...

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

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

  6. PowerShell 中 RunspacePool 执行异步多线程任务

    在 PowerShell 中要执行任务脚本,现在通常使用 Runspace,效率很高:任务比较多时,用 Runspace pool 来执行异步操作,可以控制资源池数量,就像 C# 中的线程池一样 == ...

  7. Django xadmin引入DjangoUeditor

    Django xadmin引入DjangoUeditor 版本:python3.6.1,Django1.11.1 DjangoUeditor下载地址:https://github.com/twz915 ...

  8. 计算属性 vs 侦听属性 当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的

    https://cn.vuejs.org/v2/guide/computed.html#基础例子 计算属性 vs 侦听属性 Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动:侦听属 ...

  9. SpringBoot2.0 基础案例(04):定时任务和异步任务的使用方式

    一.定时任务 1.基本概念 按照指定时间执行的程序. 2.使用场景 数据分析 数据清理 系统服务监控 二.同步和异步 1.基本概念 同步调用 程序按照代码顺序依次执行,每一行程序都必须等待上一行程序执 ...

随机推荐

  1. Python 包制作

    Python 包制作 官方文档 Python 包目录 /package_parent_folder /package /__init__.py 在__init__.py文件内添加name = pack ...

  2. 关于对pei

    我现在才开始整理这个不算晚吧...... 望轻喷 学习博客 我们需要四个程序 1.暴力 2.“正解” 3.数据生成器 4.检查程序 暴力: 就是暴力 eg: #include <cstdio&g ...

  3. [LeetCode] 660. Remove 9 移除9

    Start from integer 1, remove any integer that contains 9 such as 9, 19, 29... So now, you will have ...

  4. Spring事物隔离级别及事物传播行为@Transactional实现

    阅读本篇文章前,请先阅读如下文章: 四种事物隔离级别详解 先看下@Transactional可以配制那些参数及以其所代表的意义. isolation 枚举org.springframework.tra ...

  5. mqtt数据采集器

    MQTT是一种发布(publish)/订阅(subscribe)协议,MQTT协议采用发布/订阅模式,所有的物联网终端都通过TCP连接到云端,云端通过主题的方式管理各个设备关注的通讯内容,负责将设备与 ...

  6. 奥展项目笔记02--一个bat文件运行多个java jar包

    奥展项目中后端微服务有很多jar包,一个一个启动又费时间效率又低,怎么才能一下让所有的jar包一块运行呢?我们可以编写.bat文件来一键启动. 1.我们将.bat文件放到jar包的同一级目录文件夹中: ...

  7. Deep Learning专栏--强化学习之MDP、Bellman方程(1)

    本文主要介绍强化学习的一些基本概念:包括MDP.Bellman方程等, 并且讲述了如何从 MDP 过渡到 Reinforcement Learning. 1. 强化学习基本概念 这里还是放上David ...

  8. C++中的双冒号作用

    1. 作用域符号::的前面一般是类名称,后面一般是该类的成员名称,C++为例避免不同的类有名称相同的成员而采用作用域的方式进行区分如:A,B表示两个类,在A,B中都有成员member.那么      ...

  9. Python '\r', '\n', '\r\n' 的彻底理解

    回车和换行的历史: 机械打字机有回车和换行两个键作用分别是: 换行就是把滚筒卷一格,不改变水平位置.   (即移到下一行,但不是行首,而是和上一行水平位置一样) 回车就是把水平位置复位,不卷动滚筒.  ...

  10. 大数据基础总结---HDFS分布式文件系统

    HDFS分布式文件系统 文件系统的基本概述 文件系统定义:文件系统是一种存储和组织计算机数据的方法,它使得对其访问和查找变得容易. 文件名:在文件系统中,文件名是用于定位存储位置. 元数据(Metad ...