python--celery
Posted traditional
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python--celery相关的知识,希望对你有一定的参考价值。
有些时候我们的一些任务比较耗时,比如我们写了一个网站,用户注册的时候需要发送邮件。但是发送邮件的过程比较耗时,用户必须要等到我们将邮件发送成功之后才会得到响应。那么有没有一种办法,当用户点击发送邮件的时候,我们立即返回邮件已经发送成功呢?不需要等到邮件发送成功之后再返回,而是发送的同时就返回。
答案是可以的,可以使用celery来实现,celery的架构如下图所示,celery相当于是一个指挥官,真正干活的是下面四个组件。
task:我们需要执行的任务
broker:redis,rabbitMQ等消息队列,celery会将task扔进broker里面,进行排队,统一管理
worker:干活的人,celery会从broker当中取出task交给worker去执行
backend:保存任务的执行结果
我们是在windows上进行演示,所以还需要eventlet这个任务调度框架,pip install eventlet即可
‘‘‘ tasks.py,存储任务 ‘‘‘ from celery import Celery import time # main:当前的py文件名 # broker:中间人,比如redis,指定方式redis://:[email protected]:port/db,我们这里没有密码,直接redis://localhost:6379/0即可 # backend:结果存储的位置 celery = Celery(main="tasks", broker="redis://localhost:6379/0", backend="redis://localhost:6379/0") # 创建任务,模拟发送邮件。 # 如何变成任务呢?只需要加上一个装饰器,就变成了一个任务 @celery.task def send_mail(): print("邮件开始发送。。。。。") time.sleep(3) print("邮件发送结束。。。。。")
‘‘‘ main.py,运行任务 ‘‘‘ from tasks import send_mail import time if __name__ == ‘__main__‘: start = time.time() # 这个时候不能直接执行send_mail(),而是要使用delay方法 send_mail.delay() # 我们在tasks.py中定义的send_mail函数中,有time.sleep(5),但是send_mail.delay()是不会管的 # 会瞬间执行完毕 end = time.time() print(end - start)
已经启动成功了
我们来执行一下main.py,可以瞬间执行,同时在终端会打印出结果。这里就不再演示了,因为celery原码有问题,在下一个版本应该会修复
以上是关于python--celery的主要内容,如果未能解决你的问题,请参考以下文章