cover_image

探索Python中的任务优化利器

王红彬 之家技术
2023年11月24日 02:04

关注“之家技术”,获取更多技术干货

图片

图片

总篇233篇 2023年第47篇



1. 引言

在自动化测试中,定时任务的管理和执行是一个关键问题。无论是数据处理、自动化报告生成、还是其他周期性任务,都需要一种可靠的方式来安排和执行这些任务。本文将探索Python中Celery与Redis的应用,以解决定时任务管理中的关键问题。


► 在项目中的应用:

图片

AIDCC主动探测工具实现的主动外呼通信模块中,通过定时触发外呼操作,借助异步任务的方式实时监控通话内容,并对其中使用的NLP(自然语言处理)和ASR(自动语音识别)服务进行质量评估。同时,我们还收集并统计ASR和NLP服务的准确率,以便对其性能进行优化和改进。


► 对项目的意义:

图片

Python编程语言提供了多个框架,如Schedule、APScheduler和Celery,可以用于实现这些任务处理的功能。下面将对它们进行比较:

图片

收益:

Celery+redis组合能自动执行重复性任务和功能性配置,提升工作效率并助力自动化流程。这种优化有助于提高项目的执行效率,降低人力成本,并增强系统的自动化能力。

可以明显看出Celery不仅提供了强大的异步任务处理功能,还支持分布式任务处理,任务的执行状态和结果可以安全地存储在Mysql中,以确保任务执行的可靠性和持久性。使用Celery和Redis,主动探测工具可以更好地实现任务调度、并发执行和分布式任务处理,解决任务处理的挑战,提高系统的性能、可扩展性和可靠性。


2. Celery

2.1

基本概念

Celery是一个强大的分布式任务队列框架,也可以用于执行定时任务。它支持异步任务处理和分布式任务处理,并提供了丰富的任务调度选项和灵活的调度策略。celery采用典型生产者和消费者模型。生产者提交任务到任务队列,众多消费者从任务队列中取任务执行。


2.2

Celery架构

图片

下面给出上述流程的解释:

当任务被调用时,生产者会将执行请求提交给一个中间代理(Redis)的任务队列

对于异步任务,工作进程(Worker)会立即从队列中取出任务并执行,执行的结果会保存在一个后端(Mysql)中,供之后的查询和处理。

对于定时任务,Celery框架中的Celery Beat进程会周期性地将定时任务发送到任务队列中的中间代理(Redis)。工作进程会实时监视任务队列,从中获取任务并进行执行。


2.3

配置Celery和Redis连接

图片

在项目下新建一个celery.py文件,设置celery的工作目录并实例化celery

图片

新建celeryconfig.py文件,指定Redis作为消息中间件,Mysql作为结果存储器


3. 任务调度与执行

3.1

单个celery的worker服务

一个简单的celery+redis单架构服务,是可以满足主动探测定时任务和异步任务的执行。

图片

任务执行流程:

1.在Task.py文件中创建定时任务函数,且在配置文件指定任务队列

2.在服务器端启动beat、worker进程

3.Beat把需要执行的定时任务或异步任务提交到Redis队列中

4.如果是异步任务,worker会立即从队列中取出任务并执行,执行结果保存在Mysql中

5.如果是定时任务,任务由Celery Beat进程周期性地将任务发往Broker队列,Worker实时监视消息队列获取队列中的任务执行

存在问题:

1.单个worker进程存在故障风险,导致队列中的任务阻塞,不能正常执行

2.并发执行能力有限


3.2

多个worker并发执行

随着主动探测工具中要执行的定时任务或异步任务增加,为了提高任务处理的效率和性能。引用多个Worker可以同时处理多个任务,从而提高整体的任务处理能力。并发执行能够使系统能够同时处理多个任务请求,减少任务的等待时间和响应时间。

图片

任务执行流程:

1.在服务端启使用celery -A myapp worker --concurrency=5,启动5个worker进程

2.Beat同时提交多个任务到Redis中,5个worker进程各自独立从从队列中获取一个任务并执行。由于每个Worker进程是并行执行的,因此这些任务可以同时被处理,提高了任务的并发性。

存在问题:

在使用Redis作为Celery的消息中间件时,如果启动了多个Celery Worker进程,并且这些Worker进程共享同一个任务队列,并且每个Worker进程在任务队列中都能看到相同的任务,那么会导致定时任务的重复执行。

解决办法:

1.配置定时任务的执行时间和频率,确保不同Worker进程之间的时间间隔足够大,以避免在同一时间点同时执行任务   

2.结合使用分布式锁机制,比如Redis的分布式锁,确保在某一时刻只有一个Worker进程能够执行定时任务


3.3

分布式任务处理

随着接入主动探测工具的任务类型增多,同时需要在相同时间点执行大量的定时任务和异步任务。为了提高执行效率,需要采取一系列措施,如配置不同Worker之间的间隔、增加分布式锁等。然而,这些方法的效果可能会受到限制,无法满足不断增加的任务需求。为了进一步提高并发执行任务的数量和效率,引入分布式任务处理方式是一个更好的选。

图片


 任务执行流程:

1. Celery配置文件,针对不同的woker服务器,创建对应的消息队列

图片

2.在部署celery的节点服务器上,启动worker进程指定消费的队列,任务提交到对应的Broker队列中,worker进程会立即从匹配队列中取出任务并执行

3.Celery节点服务上的worker进程执行完任务,执行结果存储到mysql中


3.4

 分布式任务处理优势

通过引入分布式任务处理方式,可以将任务分发到多个节点上并行处理,充分利用系统资源,提高任务执行的并发性和吞吐量。分布式任务处理系统通常包括任务调度器、消息队列和多个任务执行节点(Workers)。任务调度器负责将任务分发到消息队列中,而多个任务执行节点从消息队列中获取任务并执行。这种分布式架构使得系统能够水平扩展,可以根据任务的数量和负载情况动态地增加或减少执行节点,以满足不断增长的任务需求。


4. 总结

本文介绍了如何使用Celery和Redis实现任务处理和异步处理的功能。在实现过程中,需要进行Celery和Redis环境的配置和集成,包括组件的安装、配置文件的设置以及在项目中正确设置Celery应用。此外,还需要对任务拆分、资源调优、监控和错误处理进行优化。


作者简介

图片


王红彬

主机厂事业部-技术部-系统技术团队

 简介

2018年加入汽车之家,目前任职于主机厂事业部-技术部-系统技术团队,主要负责自动化相关的工作。






图片


阅读更多:


▼ 关注「之家技术」,获取更多技术干货 

图片


继续滑动看下一个
之家技术
向上滑动看下一个