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)

浙公网安备 33010602011771号