Flask 与 Celery 在 windows 下的集成问题

所有的 Web 框架内部的视图中不适合执行需要长时间运行的任务,包括 Flask 、Django 等。这类型的任务会阻塞 Web 的响应,导致用户在等待执行结果,对用户不友好。发送邮件通知、数据统计等任务,执行时间长,应该自动或由用户触发,然后在后台执行。

后台执行的方式有多种,多线程、多进程都可以。但要注意,一般不要直接在 Web 框架中触发多线程任务,因为无法确定 web 服务器会否进行回收线程导致任务中止,不够可靠。可以通过独立的服务进程,自己写线程任务或多进程任务完成这些操作。更加可靠和方便的方法是使用 Celery 和消息队列的方式,让 Celery 来管理相关的任务,同时也便于监控。

Flask 的在线文档有一个简单的方法集成 Celery 和 Flask Celery Based Background Tasks 。这个方法在 Unix-link 系统中工作正常,在 windows 上以工厂模式工作时,会因为 windows 的进程创建机制问题工作异常,包括像 Flask-CeleryExt / Flask-Celery-Helper 都有点问题,Celery 的 worker 子进程无法加载 Flask 的 App Context 。

这里提供一个各个平台都可行的方法,假设布局如下:

  1. app.py

    这个文件以工厂模式创建 Flask App

     from flask import Flask
    from flask.ext.sqlalchmey import SQLAlchemy db = SQLAlchemy() def create_app(config):
    app = Flask(__name__)
    app.config.from_object(config) db.init_app(app) # 加载 blueprint return app
  2. tasks.py

    这个文件定义 celery 任务

     from celery import current_app as current_celery
    from app import db @current_celery.task()
    def say_hello(name):
    # 数据库操作,db.session...
    return 'Hello, %s!' % name
  3. config.py

    配置文件

     class config(object):
    # ...
    CELERY_BROKER_URL = 'sqla+sqlite:///celery-broker.sqlite'
    CELERY_RESULT_BACKEND = 'db+sqlite:///celery-result.sqlite'
    CELERY_ALWAYS_EAGER = True
  4. manage.py

    这个文件作为程序入口

     from flask.ext.script import Manager
    from app import create_app
    from celery import Celery, Task
    from config import config app = create_app(config)
    manager = Manager(app) class AppContextTask(Task):
    abstract = True def __call__(self, *args, **kwargs):
    if config.CELERY_ALWAYS_EAGER:
    return super(BoundTask, self).__call__(*args, **kwargs)
    else:
    with app.app_context():
    return super(BoundTask, self).__call__(*args, **kwargs) celery = Celery(app.import_name, broker=config.CELERY_BROKER_URL),
    set_as_current=True, task_cls= AppContextTask)
    celery.conf.update(app.config) # ... 其它 if __name__ == '__main__':
    manager.run()

在调试时,可把 CELERY_ALWAYS_EAGER 设置为 True ,那么所有的调用会变为实时调用,不通过 Broker 进行,因此在 AppContextTask 中,就不需要重新注入 App Context 。

这种方法在 windows 、linux 和 mac 上已测试过可行,但是要注意,Flask 的 app 和 AppContextTask 必须在同一个文件一起创建,我尝试过以 Flask 扩展中 init_app 的方式处理时,发现新生成的 Celery 对象和原始 Celery 对象完全不同,无法保留原始 Flask app 的信息,不得不以这种方式处理。

Flask 与 Celery 在 windows 下的集成问题的更多相关文章

  1. windows下 php集成环境如何通过cmd执行命令

    ---恢复内容开始--- php学习过程中 Windows环境下的php集成程序很多 这样方便了学习 但是在熟悉命令使用方面可以说是十分不便 本文将从两个方便 向大家介绍如何快速通过cmd命令实现命令 ...

  2. Celery 在Windows下启动worker时出现错误:ValueError: not enough values to unpack (expected 3, got 0)

    在公司Linux环境下没有出现问题,在回到家后直接在Windows10下运行出现错误: ValueError: not enough values to unpack (expected 3, got ...

  3. 【xampp】windows下XAMPP集成环境中,MySQL数据库的使用

    在已经安装了XAMPP之后,会在你安装的目录下面出现”XAMPP“文件夹,这个文件夹就是整个XAMPP集成环境的目录. 我们先进入这个目录,然后会看到带有XAMPP标志的xampp-control.e ...

  4. windows下XAMPP集成环境中,MySQL数据库的使用

    https://jingyan.baidu.com/article/d169e186467a44436611d8b1.html

  5. 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一)

    相关连接导航 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二) 常用 Gulp 插件汇总 ...

  6. 【转】linux和windows下安装python集成开发环境及其python包

    本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...

  7. windows下利用virtual 安装 flask

    出处: https://segmentfault.com/a/1190000002450878 本文介绍Windows下如何从零开始搭建Python + Flask开发环境. 安装Python 2.7 ...

  8. Windows下的Objective-C集成开发环境(IDE)(转)

    Objective-C是苹果软件的编程语言,想要上机学习.调试,有一个集成开发环境(IDE)方便很多.有三类方法搭建Objective-C的集成开发环境: 1)   使用苹果的平台,集成开发环境使用X ...

  9. php Windows系统 wamp集成环境下redis的使用

    先说一下我的本地环境,使用的是wamp集成环境,(Apache 2.4.9.PHP 5.5.12.MySQL 5.6.17) windows下安装PHP扩展: 第一步:找到扩展文件(.dll),htt ...

随机推荐

  1. Asp反向代理程序,调用远程站点全站数据,一款脚本级反向代理程序.

    前些天临时写的一脚本级反向代理程序,用法很简单,设置好目标站地址,然后放到你网站根目录:index.asp,再将404页面自定义为:index.asp,即可. 由于暂时没有 url 替换需要,所以没有 ...

  2. 是否采用Sybase形式的自动字符串转义(用 '' 表示 ')

    ;; 关于php.ini ;; ; 这个文件必须命名为'php.ini'并放置在httpd.conf中PHPINIDir指令指定的目录中. ; 最新版本的php.ini可以在下面两个位置查看: ; h ...

  3. Java学习记录-注解

    注解 一.org.springframework.web.bind.annotation ControllerAdviceCookieValue : 可以把Request header中关于cooki ...

  4. Maven学习记录

    一.简单介绍 Maven 是一个项目构建和管理自动化工具,通过它可以便捷的管理项目的生命周期,包括项目的jar包依赖,开发,测试,发布,打包等. 二.基本概念 2.1 Pom - 项目对象模型 全称( ...

  5. 如何用Apache POI操作Excel文件-----如何对一个单元格加注解?

    有的时候,我们需要通过操作Apache POI,在生成Cell数据的同时,能对其生成的Cell,加上注解(comments),类似于下面的. 那么对于这种情况,我们的代码应该如何写呢? 借花献佛,我就 ...

  6. [故障处理]联想笔记本故障0x0000007B

    同事笔记本故障,莫名其妙的快捷方式就找不到了.开始程序中的内容也无法正常查看. 解决步骤: 1.怀疑用户配置的问题,新建一个用户,没有解决. 2.使用自带的一键恢复ThinkVantage,恢复后,重 ...

  7. Bootstrap页面布局10 - BS代码

    网页中标记代码内容使用code和pre标签 要在HTML中显示标签本来的样子需要转化为实体 在此附上百度的实体字符:http://baike.baidu.com/view/4757776.htm#3 ...

  8. Gradient

    https://en.wikipedia.org/wiki/Gradient

  9. Bit-Value Type

    https://dev.mysql.com/doc/refman/5.7/en/bit-type.html MySQL 5.7 Reference Manual  /  ...  /  Bit-Val ...

  10. IMAP和POP3有什么区别

    http://help.163.com/10/0203/13/5UJONJ4I00753VB8.html?servCode=6010237 IMAP和POP3有什么区别?   POP3协议允许电子邮件 ...