python之celery在flask中使用

现在继续学习在集成的框架中如何使用celery.

在Flask中使用celery

在Flask中集成celery需要做到两点:

  1. 创建celery的实例对象的名字必须是flask应用程序app的名字,否则celery启动会失败;
  2. celery必须能顺利加载初始化文件。

celery在flask中初始化

由于celery进程的运行和flask进程的运行是相互独立的,但是在框架中我们希望只使用一份配置文件,这样可以简化配置的工作。

from celery import Celery
from flask import Flask

app = Flask(__name__)

def make_celery(app):
    celery = Celery(app.import_name)
    celery.conf.update(app.config)
    return celery

celery = make_celery(app)
# celery的配置文件在app的setting中;

问题:上面的做法程序在初始化的时候可以完成celery的初始化,但是当使用工厂模式创建app的时候,celery的初始化变得困难;

from celery import Celery
from flask import Flask

celery = None

def make_celery(app):
    celery = Celery(app.import_name)
    celery.conf.update(app.config)
    return celery

def create_app(config_name)
    app = Flask(__name__)
    config_class = config_map[config_name]
    app.config.from_object(config_class)
    # 初始化celery
    global celery
    celery = make_celery(app)
  • 问题:由于程序初始化的时候并不能创建出app对象,所以celery启动的时候必须先在tasks中导入app对象才能完成初始化,可能导致循环导入的错误;
  • 解决:引入Flask-Celery-Helper,帮助我们初始化celery对象;
  • 安装Flask-Celery-Helper
pip install Flask-Celery-Helper
  • 将所有额外的需要初始化的对象独立出来在一个单独的py模块。
# extensions.py
from flask_celery import Celery
# 创建celery的实例
celery = Celery()

# __init__.py
from extensions import celery

def create_app(config_name)
    app = Flask(__name__)
    config_class = config_map[config_name]
    app.config.from_object(config_class)
    # 对celery进行初始化操作,可以将celery的配置写在app的配置中
    celery.init_app(app=app)

# tasks.py
from extensions import celery

@celery.task()
def add(x,y):
    return x + y

注意

  • Flask-Celery-Helper官方目前只支持到python3.4,但楼主使用py3.6也没有问题;Flask-Celery-Helper不支持celery4.X的版本,否则报错,因此需要使用celery3.x的版本;
  • 调用task方法
# app.py

from tasks import add
@app.route("/index")
def index():
    """一个测试的实例"""
    print(add(3+6)) # add函数也能做普通的函数使用
    add.apply_async(args=[5,7], queue=‘eegqueue‘) # 发送异步任务,指定队列

    return "ok!"

启动celery

启动celery之前需要加载flask的app的配置,因此需要创建一个app对象给celery使用。

# run_celery.py
import create_app
flask_app = create_app("develop") # 创建app的同时,对celery完成了加载配置的工作
from extensions import celery # 此时的celery对象已经在上下文中完成初始化
# 找到celery实例的位置,指定worker,指定接收某个队列的消息,如果不指定则接收所有队列的消息
celery -A run_celery.celery worker -Q eegqueue --loglevel=info
  • 参考:
  • https://pypi.org/project/Flask-Celery-Helper/#description

原文地址:https://www.cnblogs.com/cwp-bg/p/9259974.html

时间: 2024-07-29 14:16:31

python之celery在flask中使用的相关文章

Python框架学习之Flask中的常用扩展包

Flask框架是一个扩展性非常强的框架,所以导致它有非常多的扩展包.这些扩展包的功能都很强大.本节主要汇总一些常用的扩展包. 一. Flask-Script pip install flask-script 作用: 1. 可以让我们通过命令行的方式启动服务器,还可以手动指定参数,如ip,port. python hello.py runserver -h 127.0.0.1 -p 6666 2. 结合Flask-Migration扩展包可以实现对数据的迁移 二. Flask-WTF 作用是为了能

Python框架学习之Flask中的数据库操作

数据库操作在web开发中扮演着一个很重要的角色,网站中很多重要的信息都需要保存到数据库中.如用户名.密码等等其他信息.Django框架是一个基于MVT思想的框架,也就是说他本身就已经封装了Model类,可以在文件中直接继承过来.但是在Flask中,并没有把Model类封装好,需要使用一个扩展包,Flask-SQLAlchemy.它是一个对数据库的抽象,让开发者不用这些编写SQL语句,而是使用其提供的接口去操作数据库,这其中涉及到一个非常重要的思想:ORM什么是ORM呢?下面我们就来详细讲解一下.

【译】在Flask中使用Celery

为了在后台运行任务,我们可以使用线程(或者进程). 使用线程(或者进程)的好处是保持处理逻辑简洁.但是,在需要可扩展的生产环境中,我们也可以考虑使用Celery代替线程. Celery是什么? Celery是个异步分布式任务队列. 通过Celery在后台跑任务并不像用线程那么的简单,但是用Celery的话,能够使应用有较好的可扩展性,因为Celery是个分布式架构.下面介绍Celery的三个核心组件. 生产者(Celery client).生产者(Celery client)发送消息.在Flas

python web开发-flask中日志的使用

Flask使用日志记录的方式: 1. 初始化flask应用实例 在flask中使用logger,需要初始化一个flask的应用 app = Flask(__name__) 2. 调用logger 直接调用logger方法 app.logger.info("my first logging") 这里记录的是info级别的日志 3. 查看结果 运行结果如下: INFO in Code [D:/xxxxx/flask/Code.py:20]: my first logging 默认情况下,f

在Flask中使用Celery

基于Celery的后台任务 在 Flask 中使用 Celery 原文地址:https://www.cnblogs.com/believepd/p/10645208.html

在flask中使用celery的实践

前言 在web开发中我们经常会遇到一些耗时的操作,比如发送邮件/短信,执行各种任务等等,这时我们会采取异步的方式去执行这些任务,而celery就是这样的一个异步的分布式任务处理框架,官方文档 今天,我们的主题是celery如何与flask一起工作,我们都知道,flask是一个非常小巧的web框架,有许许多多的扩展,celery也不例外,我们先看下目前常用的几个flask-celery的扩展: Flask-Celery: celery作者本人开发的,其实不算扩展,功能就是安装celery及其相关组

python web开发-flask中url带斜线/和不带斜线/的区别详解

flask中带斜线和不带斜线的url 通过flask进行路由配置的时候,有一个细节,就是同样的url,带上"/"和不带"/"有什么区别. 举例说明: 比如有个url,名字为"/url" 先同时定义两种url,一种带"/",一种不带"/",如下代码: @app.route("/url")def urlWithOut():return "url with out /" @

【理论】python使用celery异步处理请求

Flask中使用celery队列处理执行时间较长的请求. 一. 安装celery pip install celery flask redis 二. celery简介 Celery是个异步分布式任务队列 通过Celery在后台跑任务并不像线程那么简单,但是用Celery的话,能够是应用有较好的扩展性,因为Celery是个分布式架构,下面介绍Celery的三个核心组件: 1. 生产者(Celery client): 生产者发送消息,在Flask上工作时,生产者在Flask应用内运行 2. 消费者(

Flask中使用mysql

Flask中使用mysql 先安装相关模块: pip  install  Flask-MySQL 先准备一下数据库 登录: mysql  -u  root  -p 创建Database和创建Table mysql> CREATE DATABASE EmpData; mysql> use EmpData; mysql> CREATE TABLE User( userId INT NOT NULL AUTO_INCREMENT, userName VARCHAR(100) NOT NULL,