码迷,mamicode.com
首页 > 编程语言 > 详细

python--celery

时间:2019-01-02 22:13:18      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:ack   组件   调度框架   答案   统一   调度   发送邮件   mail   task   

有些时候我们的一些任务比较耗时,比如我们写了一个网站,用户注册的时候需要发送邮件。但是发送邮件的过程比较耗时,用户必须要等到我们将邮件发送成功之后才会得到响应。那么有没有一种办法,当用户点击发送邮件的时候,我们立即返回邮件已经发送成功呢?不需要等到邮件发送成功之后再返回,而是发送的同时就返回。

答案是可以的,可以使用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原码有问题,在下一个版本应该会修复

 

python--celery

标签:ack   组件   调度框架   答案   统一   调度   发送邮件   mail   task   

原文地址:https://www.cnblogs.com/traditional/p/10211525.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!