2024年1月20日 18:35 by wst
异步处理Celery 是一个强大的分布式任务队列,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行。
我们通常使用它来实现异步任务( async task )和定时任务( crontab )。 异步任务比如是发送邮件、或者文件上传, 图像处理等等一些比较耗时的操作 ,定时任务是需要在特定时间执行的任务。它的架构组成如下图:
应用场景大致如下:
分布式任务:Celery 可以将任务分发到多个工作者进程或机器上执行,以提高任务处理速度。
定时任务:Celery 可以在指定时间执行任务,例如每天定时备份数据。
后台任务:Celery 可以在后台执行耗时任务,例如图像处理、数据分析等,不影响用户界面的响应。
解耦任务:Celery 可以将任务与主程序解耦,以提高代码的可读性和可维护性。
实时处理:Celery 可以支持实时处理任务,例如即时通讯、消息队列等。
从上图我们可以看到,它是一个简单的生产者、消费者模型。接着对其中的组件分别详细介绍。
顾名思义,它是产生任务的部分。主要包括两种:异步任务和定时任务。
1)异步任务一般是比较耗时或者延迟执行的任务,比如用户上传了一批数据,需要做统计分析,此时会产生一个异步任务丢到消息队列(中间件)中。
2)定时任务即那些需要定时执行的任务,比如每天早上给CEO发送某APP的统计结果。定时任务需要一个单独的进程(Celery Beat)去收集,启动命令大致为
celery beat -A wedo.period_task
这是一个消息队列,用于存储任务,不管是异步任务还是定时任务都会放到这个中间件中。一般采用Redis或者rabbitMQ作为中间件。
它的作用是从中间件中读取任务并执行。执行单元可以有多个,以提高任务的执行效率。即是Celery Worker,它在系统中是一个单独的进程。甚至可以分布于不同的机器上。启动命令大致为
# -A wedo为应用模块
# -l为日志level
# -c 为进程数
celery worker -A wedo -l debug -c 4
当异步任务执行完毕之后,要把结果存储起来以便后期查看。比如用户上传了一个大文件,文件的分析结果需要存储起来以便用户查看。
本文主要介绍了Celery架构及各部分是干什么的。有很多工具引用了celery,比如airflow、redash。
后面还会对Celery的实际应用做详细介绍,比如怎么设置Celery为常驻进程、怎么配合Django使用。敬请期待!如有高见,请不吝指教。