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. 浅入 AutoMapper

    目录 浅入 AutoMapper AutoMapper 基本使用 映射配置 映射检查 性能 Profile 配置 依赖注入 表达式与 DTO 浅入 AutoMapper 在 Nuget 搜索即可安装, ...

  2. Linux简单复习

    cd 命令:切换目录 ls命令:用于浏览目录下的文件或者文件夹 rm 命令:用于删除文件或者目录,用法 rm –rf test.txt (-r表示递归,-f表示强制) cp 命令:用于拷贝文件,用法, ...

  3. 第八章 SMS--短信服务

    今天咱们接着 上一篇 第七章 Rocketmq–消息驱动 继续写 SpringCloud Alibaba全家桶 -> 第八章 SMS–短信服务,废话不多说,开干 8.1 短信服务介绍 短信服务( ...

  4. SpringBoot从入门到精通教程(二)

    SpringBoot 是为了简化 Spring 应用的创建.运行.调试.部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖 ...

  5. 【程序包管理】本地yum仓库的创建

    一.yum优势 yum( Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器. 基於RPM包管理,能够从指定的服务器 ...

  6. matplotlib学习日记(八)----完善统计图

    (一)再说legend() import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 2.1, 0.1) y = np.p ...

  7. CentOS7安装Elasticsearch7

    下载地址:https://www.elastic.co/cn/downloads/elasticsearch 使用YUM安装 # 下载并安装公共签名密钥 rpm --import https://ar ...

  8. java文本获取

    public static String Html2Text(String inputString) {         String htmlStr = inputString; // 含html标 ...

  9. JAVA基础之接口

    接口 学习完框架之后,整合SSM过程中对于接口的认识加深了许多.根据<java核心技术>这本书进一步研究了一下. 1.概念 java核心技术是这样说的:"在Java程序设计中,接 ...

  10. Selenium执行JavaScript脚本

    JavaScript是运行在客户端(浏览器)和服务器端的脚本语言,允许将静态网页转换为交互式网页.可以通过 Python Selenium WebDriver 执行 JavaScript 语句,在We ...