celery应用
celery---分布式任务队列
Celery是一个简单,灵活且可靠的分布式系统,可以处理大量消息,同时为操作提供维护该系统所需的工具。
Celery是一个基于python开发的模块,可以帮助我们对任务进行分发和处理;
1、环境搭建:
pip3 install celery==4.4
2、Broker选择:
Celery需要一种解决消息的发送和接受的方式,我们把这种用来存储消息的的中间装置叫做message broker, 也可叫做消息中间人。 作为中间人,我们有几种方案可选择:
RabbitMQ
RabbitMQ是一个功能完备,稳定的并且易于安装的broker. 它是生产环境中最优的选择。
Redis
Redis也是一款功能完备的broker可选项,但是其更可能因意外中断或者电源故障导致数据丢失的情况。 关于是有那个Redis作为Broker,可访下面网址: http://docs.celeryproject.org/en/latest/getting-started/brokers/redis.html#broker-redis
3、创建应用
- c1.py 文件
import time
from celery import Celery
app = Celery("tasks",broker="redis://49.222.54.28:6379",backend="redis://49.222.54.28:6379")
@app.task
def x1(x,y):
time.sleep(10)
return x + y
@app.task
def x2(x,y):
time.sleep(10)
return x - y
- c2.py 文件
from c1 import x1
result = x1.delay(4,4)
print(result)
print(result.id)
- c3.py 文件
from celery.result import AsyncResult
from c1 import app
result_object = AsyncResult(id="68cd648b-da09-4fef-9efe-d9e894a6a7ee",app=app)
data = result_object.get()
print(result_object.status)
print(data)
运行代码(windows环境):
在终端下执行如下命令:
celery worker -A c1 -l info
说明:
-A 后边跟的是任务文件名
-l 是打印出日志

:
python c2.py
往任务队列中放任务,这时window环境的终端就会报一个错误信息:

这个错误只有window环境下才会出现,linux不会;这时我们需要安装一个模块:
pip install eventlet
当我们在启动worker的时候命令就应该这样写:
celery worker -A c1 -l info -P eventlet

创建完任务会有一个id值:

通过这个id值我们就能获取到执行完任务的结果:

4、在django中使用celery
第一步:【项目/项目/settings.py 】添加配置
CELERY_BROKER_URL = 'redis://192.168.16.85:6379'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_RESULT_BACKEND = 'redis://192.168.16.85:6379'
CELERY_TASK_SERIALIZER = 'json'
第二步:【项目/项目/celery.py】在项目同名目录创建 celery.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os
from celery import Celery
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'demos.settings')
app = Celery('demos')
# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')
# Load task modules from all registered Django app configs.
# 去每个已注册app中读取 tasks.py 文件
app.autodiscover_tasks()
第三步,【项目/app名称/tasks.py】:写上具体的任务
from celery import shared_task
@shared_task
def add(x, y):
return x + y
@shared_task
def mul(x, y):
return x * y
第四步,【项目/项目/__init__.py】:启动Django程序加载celery.py文件
from NewWEApi.celery import app as celery_app
__all__ = ('celery_app',)
启动worker
进入项目目录
celery worker -A demos -l info -P eventlet
说明:
-A 后边加的是项目名称
-P 后边是windows环境下需要添加的模块
编写视图函数,调用celery去创建任务
url:
url(r'^create/tasks/$', task.create_task),
url(r'^get/result/$', task.get_result),
view:
from django.shortcuts import HttpResponse
from celery.result import AsyncResult
from api.tasks import add
from NewWEApi import celery_app
def create_task(request):
result = add.delay(1,4)
return HttpResponse(result.id)
def get_result(request):
nid = request.GET.get("nid")
result_object = AsyncResult(id=nid,app=celery_app)
data = result_object.get()
return HttpResponse(data)
最后启动Django程序
celery定时任务
def create_task(request):
# 获取本地时间
ctime = datetime.datetime.now()
# 将本地时间转换成utc时间
utc_time = datetime.datetime.utcfromtimestamp(ctime.timestamp())
target_time = utc_time + datetime.timedelta(seconds=10)
result = add.apply_async(args=[2,5],eta=target_time)
return HttpResponse(result.id)
移除任务队列中的任务
result_object.forget() # 移除任务队列中的任务
result_object.revoke() # 取消任务
celery应用的更多相关文章
- 异步任务队列Celery在Django中的使用
前段时间在Django Web平台开发中,碰到一些请求执行的任务时间较长(几分钟),为了加快用户的响应时间,因此决定采用异步任务的方式在后台执行这些任务.在同事的指引下接触了Celery这个异步任务队 ...
- celery使用的一些小坑和技巧(非从无到有的过程)
纯粹是记录一下自己在刚开始使用的时候遇到的一些坑,以及自己是怎样通过配合redis来解决问题的.文章分为三个部分,一是怎样跑起来,并且怎样监控相关的队列和任务:二是遇到的几个坑:三是给一些自己配合re ...
- tornado+sqlalchemy+celery,数据库连接消耗在哪里
随着公司业务的发展,网站的日活数也逐渐增多,以前只需要考虑将所需要的功能实现就行了,当日活越来越大的时候,就需要考虑对服务器的资源使用消耗情况有一个清楚的认知. 最近老是发现数据库的连接数如果 ...
- celery 框架
转自:http://www.cnblogs.com/forward-wang/p/5970806.html 生产者消费者模式 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据 ...
- celery使用方法
1.celery4.0以上不支持windows,用pip安装celery 2.启动redis-server.exe服务 3.编辑运行celery_blog2.py !/usr/bin/python c ...
- Celery的实践指南
http://www.cnblogs.com/ToDoToTry/p/5453149.html Celery的实践指南 Celery的实践指南 celery原理: celery实际上是实现了一个典 ...
- Using Celery with Djang
This document describes the current stable version of Celery (4.0). For development docs, go here. F ...
- centos6u3 安装 celery 总结
耗时大概6小时. 执行 pip install celery 之后, 在 mac 上 celery 可以正常运行, 在 centos 6u3 上报错如下: Traceback (most recent ...
- celery 异步任务小记
这里有一篇写的不错的:http://www.jianshu.com/p/1840035cb510 自己的"格式化"后的内容备忘下: 我们总在说c10k的问题, 也做了不少优化, 然 ...
- Celery 框架学习笔记
在学习Celery之前,我先简单的去了解了一下什么是生产者消费者模式. 生产者消费者模式 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是 ...
随机推荐
- PHP 直接使用html输出excel
1 <?php 2 header("Cache-Control:public"); 3 header("Pragma:public"); 4 5 head ...
- Maven笔记之面试题合集
简介:收集整理了网上关于Maven的面试问题,准备面试使用,答案通过各种资料查证编写. 1.什么是Maven? Maven主要服务于基于java平台的项目构建,依赖管理和项目信息管理.Maven项目对 ...
- js深克隆与浅克隆
定义: 浅克隆: 克隆对象的一层属性, 如果对象还有对象的话,里面的对象没有进行克隆,只是把地址给了别人.也可以理解为只是简单的克隆了躯体,但是没有得到其灵魂: 深克隆:克隆对象的多层属性,对象里面还 ...
- Spring Cloud 2020.0.0 正式发布,全新颠覆性版本!
Spring Cloud 2020.0.0 没错,Spring Cloud 2020.0.0 正式发布了: 感谢Java技术栈群友通知,想入群的在公众号Java技术栈后台回复:wx,正在使用 Spri ...
- Java 面向对象概述
本文部分摘自 On Java 8 面向对象编程 在提及面向对象时,不得不提到另一个概念:抽象.编程的最终目的是为了解决某个问题,问题的复杂度直接取决于抽象的类型和质量.早期的汇编语言通过对底层机器作轻 ...
- NET 5 依赖注入多个服务实现类
依赖注入在 ASP.NET Core 中起中很重要的作用,也是一种高大上的编程思想,它的总体原则就是:俺要啥,你就给俺送啥过来. 服务类型的实例转由容器自动管理,无需我们在代码中显式处理. 因此,有了 ...
- [EF] - 作为DAL层遇到的问题
今天在部署一个经典三层的项目的时候,用到了EntityFramework,碰到几个问题: 在用EntityFramework将数据库导入到DAL层后,在BL层引用该DAL后,在测试项目的时候,想要查询 ...
- 微信小程序--关于加快小程序开发的几个小建议
加快小程序开发的几个小建议 1.使用 app.json创建页面 按照我们平常的开发习惯,创建一个新的页面,一般都会先创建文件夹,再创建对应page的形式,创建完成后,app.json中会自动注册该 ...
- Ubuntu安装 Sublime Text 及常用插件推荐
之前一直在用 Code Blocks 这个IDE工具,可用着还是感觉不怎么好,于是在网上找到了一篇文章,上面介绍了不少IDE,我找到了Sublime Text 感觉挺不错的. 帖子地址: http:/ ...
- C语言-表达式和运算符
表达式:表达式是c语言的主体,在c语言中,表达式由操作符和操作数组成.简单的表达式可以只有一个操作数.根据操作符的个数,可以将表达式分为简单表达式和复杂表达式,简单的表达式只含有一个操作符(如:5+5 ...