celery在flask中异步处理任务

在web中,经常需要在后台处理耗时长的任务,为了防止造成连接超时、堵塞,所需就需要异步处理。

例子:异步发送邮件

操作系统:windows

编译器:pycharm

python环境:python==3.8 flask==1.0.2 redis==3.5.3 celery==4.4.7 Flask-Mail==0.9.1 eventlet==0.26.1

windwos安装的软件:Redis 5.0.9

  redis解压后,cmd cd到解压目录,运行:redis-server.exe redis.windows.conf 运行redis服务器。

app.py

from flask import Flask
from celery import Celery
from flask_mail import Mail
app = Flask(__name__)
app.config.from_pyfile('config.py')
mail = Mail()
mail.init_app(app)
def make_celery(app):
    celery = Celery(app.import_name, backend=app.config['CELERY_RESULT_BACKEND'],
                    broker=app.config['CELERY_BROKER_URL'])
    celery.conf.update(app.config)
    TaskBase = celery.Task
    class ContextTask(TaskBase):
        abstract = True
        def __call__(self, *args, **kwargs):
            with app.app_context():
                return TaskBase.__call__(self, *args, **kwargs)
    celery.Task = ContextTask
    return celery
celery_task = make_celery(app)

config.py

#Celery 配置
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/0'    #指定消息中间件
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/0'   ##指定结果存储位置为本地数据库
CELERY_BROKER_OPTTIONS = {'visibility_timeout':3600}
CELERY_ACCEPT_CONTENT = ['application/json']  
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'Asia/Shanghai'


# Flask-Mail configuration
MAIL_SERVER = 'smtp.gmail.com'
MAIL_PORT = 587
MAIL_USE_TLS = True
MAIL_USERNAME = 'xxxx@gmail.com'
MAIL_PASSWORD = 'xxxxxxxx'
MAIL_DEFAULT_SENDER = '测试邮件','xxxx@gmail.com'

tasks.py

from app import celery_task,mail
#Send_verification_code为发送邮件的模块
from .Email import Send_verification_code
import time
@celery_task.task
def task_sendverification_code(to_addr,verification_code,displayName):
    return Send_verification_code(to_addr,verification_code,displayName)

windows开启celery:celery worker -A app.tasks -l info -P eventlet
Linux:celery worker -A app.tasks -l info

调用celery执行异步任务:task_Send_chanepass_notice.delay(a,b,c)

posted @ 2020-08-23 22:39  人生若只ru初恋  阅读(155)  评论(0)    收藏  举报