Flask 与 Celery 在 windows 下的集成问题
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 。
这里提供一个各个平台都可行的方法,假设布局如下:
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
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
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
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 下的集成问题的更多相关文章
- windows下 php集成环境如何通过cmd执行命令
---恢复内容开始--- php学习过程中 Windows环境下的php集成程序很多 这样方便了学习 但是在熟悉命令使用方面可以说是十分不便 本文将从两个方便 向大家介绍如何快速通过cmd命令实现命令 ...
- Celery 在Windows下启动worker时出现错误:ValueError: not enough values to unpack (expected 3, got 0)
在公司Linux环境下没有出现问题,在回到家后直接在Windows10下运行出现错误: ValueError: not enough values to unpack (expected 3, got ...
- 【xampp】windows下XAMPP集成环境中,MySQL数据库的使用
在已经安装了XAMPP之后,会在你安装的目录下面出现”XAMPP“文件夹,这个文件夹就是整个XAMPP集成环境的目录. 我们先进入这个目录,然后会看到带有XAMPP标志的xampp-control.e ...
- windows下XAMPP集成环境中,MySQL数据库的使用
https://jingyan.baidu.com/article/d169e186467a44436611d8b1.html
- 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一)
相关连接导航 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二) 常用 Gulp 插件汇总 ...
- 【转】linux和windows下安装python集成开发环境及其python包
本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...
- windows下利用virtual 安装 flask
出处: https://segmentfault.com/a/1190000002450878 本文介绍Windows下如何从零开始搭建Python + Flask开发环境. 安装Python 2.7 ...
- Windows下的Objective-C集成开发环境(IDE)(转)
Objective-C是苹果软件的编程语言,想要上机学习.调试,有一个集成开发环境(IDE)方便很多.有三类方法搭建Objective-C的集成开发环境: 1) 使用苹果的平台,集成开发环境使用X ...
- php Windows系统 wamp集成环境下redis的使用
先说一下我的本地环境,使用的是wamp集成环境,(Apache 2.4.9.PHP 5.5.12.MySQL 5.6.17) windows下安装PHP扩展: 第一步:找到扩展文件(.dll),htt ...
随机推荐
- maven 将依赖的jar包打入jar包中
pom中加入以下代码,利用mvn assembly:assembly就可以了. <build> <plugins> <plugin> <artifactId& ...
- hdu City Game
做这题之前建议做一下hdu1506题,两道题是极度相似的题,不同的是这个要处理的是m行,所以可以用一个dp[][]数组存储矩形的高度,之后就变成hdu1506了. 例如测试样例: 0 1 1 1 1 ...
- Linux环境下实现哲学家就餐问题(2)
#include <stdio.h> #include <pthread.h> #include <stdlib.h> #include <string.h& ...
- Struts2 实战(一)
环境: Ubuntu 14.04 LTS 64位 开发工具的准备 我选择 Eclipse, 而没有选择MyEclipse, 一是因为免费,不想去弄破解,二是不想太傻瓜化的东西(注:本人并没有用过MyE ...
- java web工程之Hibernate
java web添加structs特性后再添加Hibernate特性,这可以通过右键工程->my eclipse出现工具条选中相应的条目,添加相应的属性, 添加完Hibernate后建立与数据库 ...
- HTML&CSS布局练习---360导航页面
一共分为7个部分:由HTML和CSS外部样式表做成 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...
- [ZZ] Understanding 3D rendering step by step with 3DMark11 - BeHardware >> Graphics cards
http://www.behardware.com/art/lire/845/ --> Understanding 3D rendering step by step with 3DMark11 ...
- 【转】Warning: mysql_connect(): mysqlnd cannot connect to MySQL 4.1+ using the old insecure authenticat
Warning: mysql_connect(): mysqlnd cannot connect to MySQL 4.1+ using the old insecure authenticat 当m ...
- Python中布尔类型
我们已经了解了Python支持布尔类型的数据,布尔类型只有True和False两种值,但是布尔类型有以下几种运算:与运算:只有两个布尔值都为 True 时,计算结果才为 True.True and T ...
- 用正则验证字符串格式,形如:A)XXX B)XXXX C)XXX
今天遇到个小功能,要验证某个英文选项是否正确,例如:A)accumulate B)circling C)communities D)competition E)domestic F)financi ...