celery的中文_技术 | Python必备技能Celery入门教程

91e2143429bf2d0979dc63d70b61fc16.png

黑马程序员

微信号:heiniu526

传智播客旗下互联网资讯,学习资源免费分享平台

在一个应用服务中,对于时效性要求没那么高的业务场景,我们没必要等到所有任务执行完才返回结果,例如用户注册场景中,保存了用户账号密码之后,就可以立即返回,后续的账号激活邮件,可以用一种异步的形式去处理,这种异步操作可以用队列服务来实现。否则,如果等到邮件发送成功可能几秒过去了。

| 本教程的目的:帮助大家去了解Celery并能够进行基本的。

e5edb69dfe08139960f5dba708286e51.png Celery 是什么?

Celery 是 Python 语言实现的分布式队列服务,除了支持即时任务,还支持定时任务,Celery 有5个核心角色。

① Task

任务(Task)就是你要做的事情,例如一个注册流程里面有很多任务,给用户发验证邮件就是一个任务,这种耗时任务可以交给Celery去处理,还有一种任务是定时任务,比如每天定时统计网站的注册人数,这个也可以交给Celery周期性的处理。

② Broker

Broker 的中文意思是经纪人,指为市场上买卖双方提供中介服务的人。在Celery中它介于生产者和消费者之间经纪人,这个角色相当于数据结构中的队列。例如一个Web系统中,生产者是处理核心业务的Web程序,业务中可能会产生一些耗时的任务,比如短信,生产者会将任务发送给 Broker,就是把这个任务暂时放到队列中,等待消费者来处。消费者是 Worker,是专门用于执行任务的后台服务。Worker 将实时监控队列中是否有新的任务,如果有就拿出来进行处理。Celery 本身不提供队列服务,一般用 Redis或者 RabbitMQ 来扮演 Broker 的角色。

③ Worker

Worker 就是那个一直在后台执行任务的人,也称为任务的消费者,它会实时地监控队列中有没有任务,如果有就立即取出来执行。

④ Beat

Beat 是一个定时任务调度器,它会根据配置定时将任务发送给 Broker,等待 Worker 来消费。

⑤ Backend

Backend 用于保存任务的执行结果,每个任务都有返回值,比如发送邮件的服务会告诉我们有没有发送成功,这个结果就是存在Backend中,当然我们并不总是要关心任务的执行结果。

44813ecd777db3d1545b9d2da0c936b8.png

e5edb69dfe08139960f5dba708286e51.png

快速入门

接触任何新东西,没有什么比实际动手学得更快了。假设我们选择Redis作为broker,你需要安装redis并且已经启动了redis服务(这个步骤请自行借用搜索引擎解决)。

① 安装celery

11457cb3e49795d4070e5a88b9b406c9.png

② 创建Celery实例

228f1750c4da972598b6d0e90cfdec6e.png

③ 创建任务

假设这个发送邮件的任务需要5秒钟才能执行完。

56a1239e5eb3f07ae18cd66b94ad1173.png

在没有Celery的情况下,程序顺序执行,每个步骤都需要等上一步执行完成。又叫同步操作,例如:

fbf2b5c0b6ccb3df000d253b7c009edd.png

我们可以把2放在一个任务中交给celery去异步执行,这样我们就不需要等待发邮件完成,你只需要安排celery去处理帮我去完成就好了。代码就变成了:

655b09756734a2e5b664977869503510.png

第二步是非常快的,它只需要把任务放进队列里面去,并不会等任务真正执行完。这跟生活是完全贴切的,例如我们很多事情都不是自己亲历其为去做,而是将一个不太重要或即时性没那么高的事情转交给别人处理,我可以继续处理后面的事。

④ 启动Worker

启动 Worker,监听 Broker 中是否有任务,命令:celery worker,你可能需要指定参数。

ab565356cd048588d908fadab441f7ae.png

-A: 指定 celery 实例在哪个模块中,例子中,celery实例在tasks.py文件中,启动成功后,能看到信息。

e0a20b436d66cda71588904af9a5bec8.png

函数用app.task 装饰器修饰之后,就会成为Celery中的一个Task。

⑤ 调用任务

在主程序中调用任务,将任务发送给 Broker, 而不是真正执行该任务,比如下面的主程序是 register。

53601878dab70b033f31f87b7288d806.png

在主程序中,调用函数的.delay方法,目录结构:

cdaac93b84a54816e03ed6ee77f4725f.png

运行 python user.py, 启动应用程序。

b5dcd867d4bfbec770a72507deec4e2a.png

程序花了不到0.23秒就执行完成,如果按照正常的同步逻辑去执行,至少需要5秒钟,因为发邮件的任务就花了5秒。

在worker服务窗口看日志信息:

0e429684b6511b3643f6470b554b8d83.png

注意

1、celery worker 启动时,如果是root用户,需要设置环境变量:

047af6ed9b036ec843e5fe9f24a8992c.png

2、 Celery4.x 开始不再支持Windows平台,如果需要在Windows开发,请使用3.x的版本。

3、使用 RabbitMQ 或 Redis 作为 Broker,生产环境永远不要使用关系数据库。

4、不要使用复杂对象作为任务函数的参数。

87cf3697000c3798eb48d5a857152d4d.png

d08dbe9985473c1e805a8f02a7dd7792.png

e5edb69dfe08139960f5dba708286e51.png 总结

学习Celery,首先需要知道它的应用场景,然后是Celery中的常见角色,最后按照步骤感受一下Celery是如何跑起来的。

热点文章

◆  这些公司疯狂抢人,月薪过万却无人应聘!

◆  63道java面试真题击破BAT招聘套路!跳槽季助你一臂之力

◆  2019年该岗位招聘量高达60000+,平均月薪19890元……

6d470e1c527be1eeacee364966807dcd.gif

▼点击 加程序员交流群

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值