Celery 3 版本 定时执行与 异步执行 | Django 案例

Celery介绍

Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery。

软件架构

Django案例

环境

* python3.6.4
* django 2.0
* django-celery==3.2.1
* django-kombu==0.9.4
* celery-with-redis==3.0
* celery==3.1.25

目录结构

autoops/
    autoops/settings
    tasks/tasks.py

settings

import djcelery

INSTALLED_APPS = [
    ‘djcelery‘,
    ‘kombu‘,
]

djcelery.setup_loader()
BROKER_URL = ‘redis://127.0.0.1:6379/0‘  #消息存储数据存储在仓库0

CELERY_RESULT_BACKEND = ‘djcelery.backends.database:DatabaseBackend‘ # 指定 Backend
CELERY_ACCEPT_CONTENT = [‘application/json‘]
CELERY_TASK_SERIALIZER = ‘json‘
CELERY_RESULT_SERIALIZER = ‘json‘

CELERY_TIMEZONE = ‘Asia/Shanghai‘

#CELERY_ALWAYS_EAGER = True   # 如果开启,Celery便以eager模式运行, 则task便不需要加delay运行

CELERY_IMPORTS = (‘tasks.tasks‘,)
CELERYBEAT_SCHEDULER = ‘djcelery.schedulers.DatabaseScheduler‘  #这是使用了django-celery默认的数据库调度模型,任务执行周期都被存在你指定的orm数据库中

tasks.py

from celery import Celery, platforms

platforms.C_FORCE_ROOT = True

app = Celery(‘my_task‘)
app.config_from_object(‘django.conf:settings‘,)
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

@app.task()
def  cmd_job(host,cmd):   ## 执行命令
    i = asset.objects.get(network_ip=host)
    ret = ssh(ip=i.network_ip, port=i.port, username=i.username, password=i.password, cmd=cmd)
    return  ret[‘data‘]

def test():  ##  下面是异步调用 celery 的例子

    from tasks.tasks import cmd_job

    aa = cmd_job.apply_async(args=(‘43.241.238.109‘, ‘pwd‘))
    print("id",aa.task_id,"返回值",aa.get() ,aa.result, "状态",aa.state)

    from  djcelery.models import TaskMeta
    b = TaskMeta.objects.get(task_id=aa).result
    print("返回值",b)

Django 后台

数据库结构

* | celery_taskmeta                   ##异步任务,会将结果写入到这个表内
* | celery_tasksetmeta
* | djcelery_crontabschedule
* | djcelery_intervalschedule
* | djcelery_periodictask
* | djcelery_periodictasks
* | djcelery_taskstate               ##django后台执行的定时任务,会将结果写到这个表里
* | djcelery_workerstate           
 from  djcelery.models import TaskMeta,TaskState          ##这样获取表

在数据库里看 result 内容是乱码,但是 通过orm获取的时候,显示是正常的。请知悉。

启动命令

 #实际执行任务的程序
/usr/bin/python   /opt/autoops/manage.py   celery worker  -c  4        --loglevel=info

#任务调度, 根据配置文件发布定时任务
/usr/bin/python   /opt/autoops/manage.py celery beat --schedule=/tmp/celerybeat-schedule --pidfile=/tmp/django_celerybeat.pid --loglevel=INFO

# Django 检查  workers  是否在线
/usr/bin/python   /opt/autoops/manage.py   celerycam --frequency=10.0

原文地址:http://blog.51cto.com/hequan/2071544

时间: 2024-10-10 03:19:37

Celery 3 版本 定时执行与 异步执行 | Django 案例的相关文章

什么是异步执行?异步执行和多线程执行的不同?

什么是异步执行? 异步执行:就是不需要等待别的任务完,就立刻执行同步执行刚好相反,异步执行,所以可以多个进程执行 异步跟多线程有什么区别? 异步同步是交互方式?多线程是性能任务的说法

同步执行与异步执行

计算机程序执行分为同步执行和异步执行 (1)同步执行 所谓的同步执行,就是正常的计算机程序执行的3大顺序流程: 顺序控制语句:从上至下,从左至右 分支控制语句:if,switch 循环控制语句:for(),while,do...while,for...in,forEach() (2)异步执行 所谓的异步执行,是一种特殊的程序的执行方式: setInterval(定时器),setTimeout(延时器) 事件的绑定 onclick,onopen,onscroll... ajax请求 (3)同步执行

GCD网络多线程---同步执行,异步执行,串行队列,并行队列

总结:同步(不管是串行还是并行)----不开辟子线程 异步(不管是串行还是并行)----开辟子线程 GCD: dispatch queue 主线程的main queue 并行队列 global dispatch queue 串行队列serial queues 一般用于按顺序同步访问 #pragma mark - 加载多线程 - (void) _loadMutil { //GCD基于C语言 //1.主对列:(串行队列) dispatch_queue_t mainQueue=dispatch_get

关于异步执行

异步执行模式 异步执行模式,是指语句在异步执行模式下,各语句执行结束的顺序与语句执行开始的顺序并不一定相同. 例如 查询操作,客户机上的应用程序在向服务器发出了查 询操作的指令后,将立刻执行查询语句指令的下一条 语句,而不需要等到服务器将查询结果返回客户机端.异步执行方式使应用程序能摆 脱单个任务的牵制,提高了灵活性和应用程序的执行 效率.但异步执行模式也存在一些问题,如它增加了编程的复杂性,特别是编写互用性(interoperable)要求较高 的程序. 在负荷很重的客户/服务器系 统中,适宜

简单说下异步执行原理。

计算机程序执行分为同步执行,和异步执行: 所谓的异步执行,是一种特殊的程序的执行方式,常见的异步程序有 定时器(setInterval),延时器(setTimeou),各种事件的绑定(onclick......),ajax请求 异步程序的执行过程 1.从第一行代码开始执行 2.同步程序开始执行 3.遇到异步程序了,暂时不执行,将异步程序暂时存储在“异步池”中 4.所有的同步程序执行完毕 5.开始执行“异步池”中的异步程序 若有设定了时间的程序,就会先执行到点了的程序 若有设定的时间是相同的程序,

Celery框架实现异步执行任务

Celery 官方 Celery 官网:http://www.celeryproject.org/ Celery 官方文档英文版:http://docs.celeryproject.org/en/latest/index.html Celery 官方文档中文版:http://docs.jinkan.org/docs/celery/ Celery架构 Celery的架构由三部分组成,消息中间件(message broker).任务执行单元(worker)和 任务执行结果存储(task result

celery异步执行任务框架

Celery 官方 Celery 官网:http://www.celeryproject.org/ Celery 官方文档英文版:http://docs.celeryproject.org/en/latest/index.html Celery 官方文档中文版:http://docs.jinkan.org/docs/celery/ Celery异步任务框架 """ 1)可以不依赖任何服务器,通过自身命令,启动服务(内部支持socket) 2)celery服务为为其他项目服务提

Celery+python+redis异步执行定时任务

我之前的一篇文章中写了[Celery+django+redis异步执行任务] 博文:http://blog.csdn.net/apple9005/article/details/54236212 你会发现,这些代码并不依赖django框架,随便写到一个py文件中,就可以轻松的执行成功,这是因为这些代码并没有用到django-celery,django-redis等依附于django框架的东西. 今天,参照官方文档示例,测试一下celery的异步执行定时任务如何.我先是在django框架内执行了一

celery 定时任务,使用crontab表达式不执行(版本4.3.x)

celery 定时任务,使用crontab表达式不执行(版本4.3.x) 在使用celery 执行定时任务时,发现任务不会执行,schedule设置如下: 经测试,如果去掉hour,则任务每分钟都会执行,说明是hour的问题,那只有是时区的问题了. 遂将hour改为UTC的时间,发现任务可以执行,说明celery使用的是UTC时区,但我设置的时区如下: CELERY_TIMEZONE='Asia/Shanghai' CELERY_ENABLE_UTC=True 注意添加任务的时候使用utc时间,