Celery初体验

celery是一个专注于实时处理和任务调度的分布式任务队列。使用的场景有下面几点。1.Web应用。当用户出发一个操作时间比较长的时候,可以把它作为任务交给celery进行异步执行,执行完之后在返回给用户。这段时间用户不需要等待,而提高了网站整体的响应时间。

celery是一个专注于实时处理和任务调度的分布式任务队列

使用的场景有下面几点。

1.Web应用。当用户出发一个操作时间比较长的时候,可以把它作为任务交给celery进行异步执行,执行完之后在返回给用户。这段时间用户不需要等待,而提高了网站整体的响应时间。

但不是这样理解。一个路由中存在一个时间较长的任务,大概执行5s。这样请求这个网站大概在5s+以上。为了不让用户进行等待,将这个任务交给celery是正确的。但是这个响应的结果是无法获得任务的结果,毕竟请求已经结束。

2.定时任务。生产环境中常常会运行一些定时任务。比如在用户的生日的时候给在某个特定是时间给用户推送篇祝福的话。

3.异步任务,在同步完成的附加任务工作好的啦;可以添加异步任务。比如发送短信验证码、邮件、推送消息、清理设置缓存等。

Celery还提供了如下的特性:

  1. 方便地查看定时任务的执行情况,比如执行是否成功、当前状态、执行任务花费的时间等。
  1. 可以使用功能齐备的管理后台或者命令行添加、更新、删除任务。
  1. 方便把任务和配置管理相关联。
  1. 可选多进程、Eventlet和Gevent三种模式并发执行。
  1. 提供错误处理机制。
  • 提供多种任务原语,方便实现任务分组、拆分和调用链。
  • 支持多种消息代理和存储后端。

python+celery+redis

在程序运行的过程中,常常会碰到一个耗时资源的操作,为了避免这些耗时的操作阻塞主程序的运行,常常采用异步任务的方式来解决。比如,在Web开发的过程中,对于新用户利用邮箱进行注册,我们通常会给注册的邮箱发送一封邮件,而这个发送邮件的过程是个IO操作的阻塞型任务,如果把他直接放到主程序中,就需要等待邮件发送完成之后才会向下进行,此时的用户只有等待。

为了避免这种阻塞型任务带来的时间的增加,便会采用一个异步的发送邮件任务,而主程序不必等待发送任务的过程,直接向下进行。从而使得资源响应的时间更快。而邮件发送成功与否与web响应没有直接的联系,就算发送失败,用户只需要在进行一次发送。

Celery是一个强大的分布式任务队列,它可以让任务完全脱离主程序,或者分配到其他的主机上运行。它可以实现两种任务模式:异步任务(async task)和定时任务(crontab)

Celery主要有以下模块

  • 任务模块(task)

包含两大任务模式:异步任务,在业务逻辑中触发并发送到任务队列。定时任务,由baet进行周期性地将任务发送到任务队列

  • 消息中间件(Broker)

Broker任务调度队列接受生产者发送到任务,将任务存储到任务队列中,Celery不带有存储任务的服务,常常和redis、rabbitMQ搭配使用

  • 任务执行单元(work)

Work,执行任务的处理单元,时刻监控着消息队列,获取队列中的调度任务,进行执行。

  • 结果存储(Backend)

Backend,储存任务执行的结果,同样可以和redis或rabbitMQ

Demo

q:celery 和 asyncio都是异步,有什么区别呢?

a:前者是任务队列,重点在分布式任务调度上,最佳应用场景是通过大后方众多worker分散高功耗、高延时任务的并发。后者就是Python3的异步IO库,重点在于对耗时的IO操作释放资源。