为什么使用CELERY而不使用线程发送耗时任务?
主要是因为并发比较大的时候,线程切换会有开销时间,假如使用线程池会限制并发的数量;因线程的ID是不一致的,同时多线程间的数据共享维护比较麻烦。使用celery,业务的主进程不会阻塞到耗时任务上。
而celery是异步任务处理,是分布式的任务队列,处理高并发,大负载的业务场景。它可以让任务的执行同主程序完全脱离,甚至不在同一台主机内。它通过队列来调度任务,不用担心并发量高时系统负载过大。它可以用来处理复杂系统性能问题,却又相当灵活易用。
Celery的底层原理(透彻一些)
celery是基于python实现的一个异步任务的调度工具,同时还是一个任务队列,主要用于处理耗时的任务。架构如下:
celery架构由三个模块组成:消息中间件(message broker),任务执行单元(worker)和任务执行结果存储(task result store)组成。
消息中间件(Broker): 消息中间人,是任务调度队列,是一个独立的服务,是一个生产者消费者模式,生产者把任务放入队列中,消费者(worker)从任务队列中取出任务执行,任务的执行可以按照顺序依次执行也可以按照计划时间进行。但是Broker本身不提供队列服务,所以要集成第三方队列,推荐使用RatbbitMQ或Redis.
任务执行单元(worker):即定时取出执行任务的程序,可以有多个并发。它实时监控消息队列,获取队列中调度的任务,并执行它。
任务执行结果存储(task result store):由于任务的执行同主程序分开,如果主程序想获取任务执行的结果,就必须通过中间件存储。同消息中间人一样,存储也可以使用RabbitMQ、Redis;另外,假如不需要保存执行的结果也可以不配置这个模块。
更对内容参考:
http://docs.celeryproject.org/en/latest/getting-started/introduction.html