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应用的更多相关文章

  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. Erlang那些事儿第2回之我是模块(module),一文件一模块

    前几篇文章会写得比较基础,但是既然要写一系列的文章,还是得从基础开始写.我刚学Erlang碰到最大的问题是,想网上搜索下语法,结果却是寥寥无几,而且介绍得不是很系统,对我了解一些细节是有影响的,正好我 ...

  2. Redis 6.0 多线程性能测试结果及分析

      单线程的Redis一向以简洁高效著称,但也有其阿喀琉斯之踵:阻塞!单个线程在最容易产生瓶颈的网络读写(Redis大key)请求完成之前,其他所有请求都将会被阻塞,严重影响其效率,因此Redis的多 ...

  3. 无法启动IIS Express Web服务器

    解决 打开项目文文件夹以.csproj结尾的文件),找到WebProjectProperties节点然后,将图中框选的三项节点内容全部清空 删除.vs 重新启动即可

  4. [从源码学设计]蚂蚁金服SOFARegistry之Data节点变更

    [从源码学设计]蚂蚁金服SOFARegistry之Data节点变更 目录 [从源码学设计]蚂蚁金服SOFARegistry之Data节点变更 0x00 摘要 0x02 引子 0x03 业务范畴 3.1 ...

  5. 红黑树规则,TreeSet原理,HashSet特点,什么是哈希值,HashSet底层原理,Map集合特点,Map集合遍历方法

    ==学习目标== 1.能够了解红黑树 2.能够掌握HashSet集合的特点以及使用(特点以及使用,哈希表数据结构) 3.能够掌握Map集合的特点以及使用(特点,常见方法,Map集合的遍历) 4.能够掌 ...

  6. Kotlin 简单使用手册

    在昨天和做android的前辈一番交谈后,觉得很惭愧,许多东西还只是知其然而不知其所以然,也深感自己的技术还太浅薄.以后要更加努力地学习,要着重学习原理.方法论,不能只停留在会用的阶段. 今天又要献丑 ...

  7. idea 中在src/main/java中的xml扫描不到问题

    <build> <!-- start idea 默认 不加载 java下的配置文件 --> <resources> <resource> <dir ...

  8. java中产品分类返回给前台页面 后台数据组装

    public ResultBean getSpfl(Integer yyb) { ResultBean res = new ResultBean(); try { JSONArray data = n ...

  9. Object[] cannot be converted to String[]

    原因: 你应该是想把List数组转 String数组吧! 然后想当然的调用list.toArray()方法. 结果 该方法返回的是Object[]数组,导致类型不匹配! 解决办法: 还在乖乖的用循环吧 ...

  10. 各开源协议BSD、Apache Licence 2.0、GPL

    以下是上述协议的简单介绍:BSD开源协议BSD开源协议是一个给于使用者很大自由的协议.基本上使用者可以"为所欲为",可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有 ...