介绍
在程序运行过程中,要执行一个很久的任务,但是我们又不想主程序被阻塞,常见的方法是多线程
。
可是当并发量过大时,多线程也会扛不住,必须要用线程池
来限制并发个数,而且多线程对共享资源的使用
也是很麻烦的事情。
还有就是前面几篇介绍过的协程
,但是协程毕竟还是在同一线程内执行的,如果一个任务本身就要执行很长时间,而不是因为等待IO被挂起,那其他协程照样无法得到运行。
本文要介绍一个强大的分布式任务队列Celery
,它可以让任务的执行同主程序完全脱离,甚至不在同一台主机内
。它通过队列来调度任务,不用担心并发量高时系统负载过大
。它可以用来处理复杂系统性能问题,却又相当灵活易用。下面我们就来了解下Celery。
架构组成
一个完整的Celery分布式队列架构应该包含一下几个模块:
消息中间人 Broker
消息中间人,就是任务调度队列,通常以独立服务形式出现。它是一个生产者消费者模式,即主程序将任务放入队列中,而后台职程则会从队列中取出任务并执行
。任务可以按顺序调度,也可以按计划时间调度。Celery组件本身并不提供队列服务,你需要集成第三方消息中间件。Celery推荐的有RabbitMQ和Redis
,另外也支持MongoDB、SQLAlchemy、Memcached等,但不推荐。
任务执行单元 Worker
也叫职程,即执行任务的程序,可以有多个并发
。它实时监控消息队列,获取队列中调度的任务,并执行它。
执行结果存储 Backend
由于任务的执行同主程序分开,如果主程序想获取任务执行的结果,就必须通过中间件存储
。同消息中间人一样,存储也可以使用RabbitMQ、Redis、MongoDB、SQLAlchemy、Memcached等,建议使用带持久化功能的存储中间件。另外,并非所有的任务执行都需要保存结果,这个模块可以不配置。