热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Celery—分布式的异步任务处理系统

Celery1.什么是CleleryCelery是一个简单、灵活且可靠的,处理大量消息的分布式系统专注于实时处理的异步任务队列同时也支持任务调度Celery架构 Celery的架构

Celery

1.什么是Clelery

Celery是一个简单、灵活且可靠的,处理大量消息的分布式系统

专注于实时处理的异步任务队列

同时也支持任务调度


Celery架构

 

Celery的架构由三部分组成:

● 消息中间件(message broker)

● 任务执行单元(worker)

● 任务执行结果存储(task result store)


消息中间件

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


任务执行单元

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


任务结果存储

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

 

 

 

 


版本支持情况

Celery version 4.0 runs on
Python ❨2.7, 3.4, 3.5❩
PyPy ❨5.4, 5.5❩
This is the last version to support Python 2.7, and from the next version (Celery 5.x) Python 3.5 or newer is required.
If you’re running an older version of Python, you need to be running an older version of Celery:
Python 2.6: Celery series 3.1 or earlier.
Python 2.5: Celery series 3.0 or earlier.
Python 2.4 was Celery series 2.2 or earlier.
Celery is a project with minimal funding, so we don’t support Microsoft Windows. Please don’t open any issues related to that platform.

 


2.使用场景

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

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


3.Celery的安装配置

pip install celery

消息中间件:RabbitMQ/Redis

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

 


4.Celery执行异步任务


基本使用

新建celery_task.py文件

# celery_task.py
from celery import Celery
# 不加密码
broker='redis://127.0.0.1:6379/0' # borker配置,任务队列
backend='redis://127.0.0.1:6379/1' # backend配置 执行结果存储

#加密码
# backend='redis://:123456@127.0.0.1:6379/1'
# broker='redis://:123456@127.0.0.1:6379/2'
#一定要指定一个名字


app=Celery('test',broker=broker,backend=backend) # 创建任务异步处理器
#任务其实就是个函数
#需要用一个装饰器 *.task装饰,表示该任务是被 * celery管理的,并且可以用celery执行的
@app.task
def add(x,y):
import time
time.sleep(2) # 模拟阻塞任务
return x+y

这样我们就完成了上图流程中的三大配置,下面我们需要去提交任务并启动worker执行任务

另建add_task.py文件

#用于提交任务的py文件
import celery_task
#提交任务到消息队列中
#只是把任务提交到消息队列中,并没有执行需要启动worker才可以生效
ret=celery_task.add.delay(3,4) # add 即celery_task中add函数
print(ret)
# ret=a5ea035f-0cc3-44ba-b334-f5d7c7ce681d :任务的id号,待任务执行完毕,需要通过这个id去backend去取执行结果

#提交定时任务:于2019-07-20 11:13:56执行的任务,此任务只是在这里提交了,需要启动worker才可以生效
from datetime import datetime
v1 = datetime(2019, 7, 20, 11, 13, 56)
print(v1) # 时间对象
v2 = datetime.utcfromtimestamp(v1.timestamp())
print(v2)
# #取出要执行任务的时间对象,调用apply_async方法,args是参数,eta是执行的时间
result = celery_task.add.apply_async(args=[1, 3], eta=v2)
print(result.id) # 任务的id号,待任务执行完毕,需要通过这个id去backend去取执行结果
#第二种获取时间的方法
ctime = datetime.now()
# 默认用utc时间
utc_ctime = datetime.utcfromtimestamp(ctime.timestamp())
from datetime import timedelta
#取10s之后的时间对象
time_delay = timedelta(secOnds=3)
task_time = utc_ctime + time_delay # 时间对象的相加
result = celery_task.add.apply_async(args=[4, 3], eta=task_time)
print(result.id)

启动worker

启动worker的两种方法:

# 方法一:
from celery_task import app
if __name__ == '__main__':
app.worker_main()
# cel.worker_main(argv=['--loglevel=info')
# 方法二:
# 命令行启动—常用
# linux下: celery worker -A celery_task_s1 -l info
# windows下:celery worker -A celery_task_s1 -l info -P eventlet #eventlet是个模块 需要pip装下

 

接下来就是查看任务执行结果了

另起result.py文件

# 创建py文件:result.py,查看任务执行结果
from celery.result import AsyncResult
from celery_task import app
async = AsyncResult(id="e919d97d-2938-4d0f-9265-fd8237dc2aa3", app=cel)
if async.successful():
result = async.get()
print(result)
# result.forget() # 将结果删除
elif async.failed():
print('执行失败')
elif async.status == 'PENDING':
print('任务等待中被执行')
elif async.status == 'RETRY':
print('任务异常后正在重试')
elif async.status == 'STARTED':
print('任务已经开始被执行')

 

总结下Celery使用步骤:

创建celery_app_task.py,配置borker\backend\worker和任务函数

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

执行命令启动worker:celery worker -A celery_app_task -l info

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

 

 下面我们进入重点:

 

 

 

 

 

 

 


推荐阅读
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 加密世界下一个主流叙事领域:L2、跨链桥、GameFi等
    本文介绍了加密世界下一个主流叙事的七个潜力领域,包括L2、跨链桥、GameFi等。L2作为以太坊的二层解决方案,在过去一年取得了巨大成功,跨链桥和互操作性是多链Web3中最重要的因素。去中心化的数据存储领域也具有巨大潜力,未来云存储市场有望达到1500亿美元。DAO和社交代币将成为购买和控制现实世界资产的重要方式,而GameFi作为数字资产在高收入游戏中的应用有望推动数字资产走向主流。衍生品市场也在不断发展壮大。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 代理模式的详细介绍及应用场景
    代理模式是一种在软件开发中常用的设计模式,通过在客户端和目标对象之间增加一层中间层,让代理对象代替目标对象进行访问,从而简化系统的复杂性。代理模式可以根据不同的使用目的分为远程代理、虚拟代理、Copy-on-Write代理、保护代理、防火墙代理、智能引用代理和Cache代理等几种。本文将详细介绍代理模式的原理和应用场景。 ... [详细]
  • 本文探讨了容器技术在安全方面面临的挑战,并提出了相应的解决方案。多租户保护、用户访问控制、中毒的镜像、验证和加密、容器守护以及容器监控都是容器技术中需要关注的安全问题。通过在虚拟机中运行容器、限制特权升级、使用受信任的镜像库、进行验证和加密、限制容器守护进程的访问以及监控容器栈,可以提高容器技术的安全性。未来,随着容器技术的发展,还需解决诸如硬件支持、软件定义基础设施集成等挑战。 ... [详细]
  • 如何使用台式电脑设置无线网络
    本文介绍了如何使用台式电脑设置无线网络的步骤,包括连接网线、更改IP、设置无线网络参数、重启路由器等,最后通过搜索无线信号来确认设置是否成功。 ... [详细]
author-avatar
血色的蓮花
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有