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://:password@host: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原码有问题,在下一个版本应该会修复

猜你喜欢

转载自www.cnblogs.com/traditional/p/10211525.html