Celery

1、什么是Celery

  • Celery是一个简单、灵活且可靠的,处理大量消息的分布式系统,专注于实时处理的异步任务队列,同时也支持任务调度。
  • 用Python写的执行 定时任务和异步任务的框架

执行异步任务:

  • 创建任务:tasks.py
  • 把任务添加到队列中:add_task.py
  • 开启work,执行任务
    • 用命令:celery -A tasks worker -l info
    • 在 Windows下:celery -A tasks worker -l info -P eventlet
  • 查看任务结果:task_resut.py

多任务结构:

  • 重点:执行work的时候:celery -A tasks worker -l info -P eventlet

2、Celery架构

Celery的架构由三部分组成,消息中间件,任务执行单元和任务执行结果存储(task result store )组成。

消息中间件

Celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成。包括,RabbitMQ, Redis等等

任务执行单元

Worker是Celery提供的任务执行的单元,worker并发的运行在分布式的系统节点中。

任务结果存储

Task result store用来存储Worker执行的任务的结果,Celery支持以不同方式存储任务的结果,包括AMQP, redis等

3、使用场景

异步任务:将耗时操作任务提交给Celery取异步执行 ,比如发送 短信、邮件、消息推送、音频/视频处理等等

定时任务:定时执行某件事情,比如每天数据统计

4、Celery的安装配置

pip install celery

app=Celery('任务名', backend='xxx',broker='xxx')

5、Celery执行异步任务

基本使用

创建项目:celerytest

创建py文件:task.py

  1. `from celery import Celery
  2. import time
  3. # broker:消息中间人用redis
  4. broker = 'redis://127.0.0.1:6397/1'
  5. # 结果存储在redis中
  6. backend = 'redis://127.0.0.1:6379/2'
  7. # 第一个参数是别名,可以随便写
  8. app = Celery('test', broker=broker, backend=backend)
  9. @app.task
  10. def add(x, y):
  11. time.sleep(3)
  12. return x + y

创建py文件:add_task.py,添加任务

  1. import task
  2. if __name__ == '__main__':
  3. # 之前这样写,直接就执行 函数
  4. task.add()
  5. # 现在把函数添加到执行队列中,参数写在delay中
  6. # result不是函数的执行结果,他是个对象
  7. result = task.add.delay(2, 3)
  8. # 这个任务唯一的id
  9. print(result.id)

创建py文件:result.py,查看任务执行结果

  1. from celery.result import AsyncResult
  2. from task import app
  3. async = AsyncResult(id='ac2a7e52-ef66-4caa-bffd-81414d869f85', app=app)
  4. if async.successful():
  5. # 任务执行的结果,也就是返回值
  6. result = async.get()
  7. print(result)
  8. # result.forget() #将结果删除
  9. elif async.failed():
  10. print('执行失败')
  11. elif async.status == 'PENDING':
  12. print('任务等待中被执行')
  13. elif async.status == 'RETRY':
  14. print('任务异常后正在重试')
  15. elif async.status == 'STARTED':
  16. print('任务已经开始被执行')

执行add_task.py,添加任务,并获取任务ID

执行命令:celery worker -A celery_app_task -l info -P eventlet

执行result.py检查任务状态并获取结果

6、Celery执行定时任务

设定时间让celery执行一个任务

add_task.py

  1. from celery_app_task import add
  2. from datetime import datetime
  3. # 方式一
  4. # v1 = datetime(2019, 2, 13, 18, 19, 56)
  5. # print(v1)
  6. # v2 = datetime.utcfromtimestamp(v1.timestamp())
  7. # print(v2)
  8. # result = add.apply_async(args=[1, 3], eta=v2)
  9. # print(result.id)
  10. # 方式二
  11. ctime = datetime.now()
  12. # 默认用utc时间
  13. utc_ctime = datetime.utcfromtimestamp(ctime.timestamp())
  14. from datetime import timedelta
  15. time_delay = timedelta(seconds=10)
  16. task_time = utc_ctime + time_delay
  17. # 使用apply_async并设定时间
  18. result = add.apply_async(args=[4, 3], eta=task_time)
  19. print(result.id)

启动一个beat: celery beat -A celery_task -l info

启动work执行:celery worker -A celery_task -l info -P eventlet

7、Django中使用Celery

在项目目录下创建celeryconfig.py

  1. import djcelery
  2. djcelery.setup_loader()
  3. CELERY_IMPORTS=(
  4. 'app01.tasks',
  5. )
  6. #有些情况可以防止死锁
  7. CELERYD_FORCE_EXECV=True
  8. # 设置并发worker数量
  9. CELERYD_CONCURRENCY=4
  10. #允许重试
  11. CELERY_ACKS_LATE=True
  12. # 每个worker最多执行100个任务被销毁,可以防止内存泄漏
  13. CELERYD_MAX_TASKS_PER_CHILD=100
  14. # 超时时间
  15. CELERYD_TASK_TIME_LIMIT=12*30

在app01目录下创建tasks.py

  1. from celery import task
  2. @task
  3. def add(a,b):
  4. with open('a.text', 'a',encoding='utf-8') as f:
  5. f.write('a')
  6. print(a+b)

视图函数views.py

  1. from django.shortcuts import render,HttpResponse
  2. from app01.tasks import add
  3. from datetime import datetime
  4. def test(request):
  5. # result=add.delay(2,3)
  6. ctime = datetime.now()
  7. # 默认用utc时间
  8. utc_ctime = datetime.utcfromtimestamp(ctime.timestamp())
  9. from datetime import timedelta
  10. time_delay = timedelta(seconds=5)
  11. task_time = utc_ctime + time_delay
  12. result = add.apply_async(args=[4, 3], eta=task_time)
  13. print(result.id)
  14. return HttpResponse('ok')

settings.py

  1. INSTALLED_APPS = [
  2. ...
  3. 'djcelery',
  4. 'app01'
  5. ]
  6. ...
  7. from django_celery import celeryconfig
  8. BROKER_BACKEND='redis'
  9. BOOKER_URL='redis://127.0.0.1:6379/1'
  10. CELERY_RESULT_BACKEND='redis://127.0.0.1:6379/2'

Celery的基本使用的更多相关文章

  1. 异步任务队列Celery在Django中的使用

    前段时间在Django Web平台开发中,碰到一些请求执行的任务时间较长(几分钟),为了加快用户的响应时间,因此决定采用异步任务的方式在后台执行这些任务.在同事的指引下接触了Celery这个异步任务队 ...

  2. celery使用的一些小坑和技巧(非从无到有的过程)

    纯粹是记录一下自己在刚开始使用的时候遇到的一些坑,以及自己是怎样通过配合redis来解决问题的.文章分为三个部分,一是怎样跑起来,并且怎样监控相关的队列和任务:二是遇到的几个坑:三是给一些自己配合re ...

  3. tornado+sqlalchemy+celery,数据库连接消耗在哪里

    随着公司业务的发展,网站的日活数也逐渐增多,以前只需要考虑将所需要的功能实现就行了,当日活越来越大的时候,就需要考虑对服务器的资源使用消耗情况有一个清楚的认知.     最近老是发现数据库的连接数如果 ...

  4. celery 框架

    转自:http://www.cnblogs.com/forward-wang/p/5970806.html 生产者消费者模式 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据 ...

  5. celery使用方法

    1.celery4.0以上不支持windows,用pip安装celery 2.启动redis-server.exe服务 3.编辑运行celery_blog2.py !/usr/bin/python c ...

  6. Celery的实践指南

    http://www.cnblogs.com/ToDoToTry/p/5453149.html Celery的实践指南   Celery的实践指南 celery原理: celery实际上是实现了一个典 ...

  7. Using Celery with Djang

    This document describes the current stable version of Celery (4.0). For development docs, go here. F ...

  8. centos6u3 安装 celery 总结

    耗时大概6小时. 执行 pip install celery 之后, 在 mac 上 celery 可以正常运行, 在 centos 6u3 上报错如下: Traceback (most recent ...

  9. celery 异步任务小记

    这里有一篇写的不错的:http://www.jianshu.com/p/1840035cb510 自己的"格式化"后的内容备忘下: 我们总在说c10k的问题, 也做了不少优化, 然 ...

  10. Celery 框架学习笔记

    在学习Celery之前,我先简单的去了解了一下什么是生产者消费者模式. 生产者消费者模式 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是 ...

随机推荐

  1. Java程序中解决数据库超时与死锁

    Java程序中解决数据库超时与死锁 2011-06-07 11:09 佚名 帮考网 字号:T | T   Java程序中解决数据库超时与死锁,每个使用关系型数据库的程序都可能遇到数据死锁或不可用的情况 ...

  2. Access 64-bit HKLM\Software Registry by 32-bit C#.NET Application

    http://www.codeproject.com/Articles/1003177/Access-bit-HKLM-Software-Registry-by-bit-Csharp-NE While ...

  3. python 切片&迭代

    Python提供了切片(Slice)操作符L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']取前3个元素>>> L[0:3]['Mich ...

  4. Java Web技术经验总结

    接口的权限认证,使用拦截器(HandlerInterceptorAdapter),参考:第五章 处理器拦截器详解——跟着开涛学SpringMVC.注意:推荐能使用servlet规范中的过滤器Filte ...

  5. JavaScript的DOM_节点的增删改

    一.概述 DOM 不单单可以查找节点,也可以创建节点.复制节点.插入节点.删除节点和替换节点.  二.write()方法 write()方法可以把任意字符串插入到文档中去.会覆盖掉原来的html &l ...

  6. 使用View填充ViewPager

    ViewPager在app开发中十分常见.今天以一个例子详细解读下ViewPager的基础知识. 一.什么是ViewPager 可以这样理解,ViewPager就相当于一个容器,它的里面可以装view ...

  7. BZOJ1396:识别子串(SAM)

    Description Input 一行,一个由小写字母组成的字符串S,长度不超过10^5 Output L行,每行一个整数,第i行的数据表示关于S的第i个元素的最短识别子串有多长. Sample I ...

  8. 1spring注解:@Configuration,@Bean,@ComponentScan(),@Scope

    传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点:1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文件 ...

  9. Redis配置文件(3)常见的配置修改

    常见的配置: redis.conf 配置项说明如下: 1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程   daemonize no   2. 当Redis以 ...

  10. ssh启动失败

    调试了两个小时.ssh启动不了. service ssh start /etc/init.d/ssh start 都尝试了,还是没法启动. [ 是否启动,可以命令行: ps -s | grep ssh ...