在应用中需要使用调度框架来做一些统计的功能,可惜在Windows上可用的不多,最后选择了APScheduler这个调度器。

用法不多介绍,只总结一下在使用中遇到的坑。

app_context 问题

凡是在APScheduler中调用的function,只要用到初始化跟app相关的对象(如db,mail),都是需要app上下文的,正常情况下都需要push app_context的。

否则将会报"No application found. Either work inside a view function or push an application context."的错误。

因为Flask-APScheduler在运行的时候是单独的一个进程,在这个进程中app是没有实例化的。使用之前要先实例化app对象。

以下代码可以解决这个问题:


#此创建app实例
def get_app():
flask_app=create_app('production')
return flask_app def job1():
with get_app().app_context():
#需要做的操作

重复运行问题

在create_app时同时创建APScheduler对象,并且init然后start,会出现一个重复运行的问题。

那是因为FastCGI进程管理器在Web Server启动时,会自动创建若干个进程等待客户端的连接。如果访问量比较大,FastCGI会创建更多的进程以响应客户端的连接。

而每启动一个进程都会在后台创建一个APScheduler对象,所以会出现重复运行的情况。

在Linux上可以通过Python的fcntl包获得一个文件的排他锁,以达到只启动一个APScheduler对象的功能。但是在Windows上没有相应的包。

试过很多种获得文件排他锁的方法,终于找到一个第三方的包:portalocker,果断安装。

使用方法如下:


scheduler=APScheduler() def create_app(config_name):
app=Flask(__name__)
app.jinja_env.trim_blocks=True
app.config.from_object(config[config_name])
config[config_name].init_app(app) scheduler_init(app) return app def scheduler_init(app):
try:
lockfile=open('scheduler.lock','w')
portalocker.lock(lockfile,portalocker.LOCK_EX | portalocker.LOCK_NB)
lockfile.write(str(datetime.datetime.now()))
scheduler.init_app(app)
scheduler.start()
except:
pass def _unlock_file():
try:
portalocker.unlock(lockfile)
except:
pass atexit.register(_unlock_file)

获得锁的进程,在解释器被销毁时会调用_unlock_file释放锁,新创建的进程又会得到锁,所以APScheduler会一直运行。

如果要想获得准确调度,可以使用APScheduler另外启动一个进程,而不要使用Flask-APScheduler。

不过Flask-APScheduler对我的应用来说够用了。

[Flask Tips]Flask-APScheduler用法总结的更多相关文章

  1. flask模板的基本用法(定界符、模板语法、渲染模板),模板辅助工具(上下文、全局对象、过滤器、测试器、模板环境对象)

    flask模板 在动态web程序中,视图函数返回的HTML数据往往需要根据相应的变量(比如查询参数)动态生成. 当HTML代码保存到单独的文件中时,我们没法再使用字符串格式化或拼接字符串的当时在HTM ...

  2. flask中Flask()和Blueprint() flask中的g、add_url_rule、send_from_directory、static_url_path、static_folder的用法

    1.Blueprint()在蓝本注册函数register_blueprint()中,第一个参数为所注册的蓝本名称.当我们在应用对象上注册一个蓝图时,需要指定一个url_prefix关键字 参数(这个参 ...

  3. 【Python】【Flask】Flask 后台发送html页面多种方法

    1.使用模板: @app.route('/') def home(): return render_template("homepage.html")#homepage.html在 ...

  4. Python flask 基于 Flask 提供 RESTful Web 服务

    转载自 http://python.jobbole.com/87118/ 什么是 REST REST 全称是 Representational State Transfer,翻译成中文是『表现层状态转 ...

  5. [Flask]学习Flask第三天笔记总结

    from flask import Flask,render_template,request from others import checkLogin app = Flask(__name__) ...

  6. Flask01 初识flask、flask配置

    1 什么是flask Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 . 百度百科:点击前往 中文文档: ...

  7. 【Flask】Flask学习笔记(一) 应用基本结构

    初始化 使用前必须创建一个应用实例 from flask import Flask app = Flask(__name__) 路由和视图函数 请求流程 客户端(web浏览器)-->  web服 ...

  8. python框架之Flask(1)-Flask初使用

    Flask是一个基于 Python 开发并且依赖 jinja2 模板和 Werkzeug WSGI 服务的一个微型框架,对于 Werkzeug 本质是 Socket 服务端,其用于接收 http 请求 ...

  9. cannot import name 'Flask' from 'flask'

    今天发现了智障的真我. 刚入门flask,建了一个文件命名叫flask.py 在virtualenv的容器里运行该py文件,报错cannot import name 'Flask' from 'fla ...

  10. flask框架----flask中的wtforms使用

    一.简单介绍flask中的wtforms WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证. 安装: pip3 install wtforms 二.简单使用wtfo ...

随机推荐

  1. net core Webapi基础工程搭建(三)——在线接口文档Swagger

    目录 前言 Swagger NuGet引用第三方类库 别急,还有 没错,注释 小结 前言 前后分离的好处,就是后端埋头做业务逻辑功能,不需要过多考虑用户体验,只专注于数据.性能开发,对于前端需要的数据 ...

  2. 01 Python网络爬虫简介

    什么是爬虫 爬虫就是通过编写程序模拟浏览器上网,然后去互联网上爬取/获取数据的过程. 爬虫的分类 - 通用爬虫:就是爬取互联网中的一整张页面内容. - 聚焦爬虫:根据指定的需求爬取页面中指定的局部内容 ...

  3. 盘一盘 NIO (二)—— Channel解析

    Channel是个啥? Channel,顾名思义,它就是一个通道.NIO中的所有IO都是从 Channel 开始的. Channel通道和流非常类似,主要有以下几点区别: 1.流是单向的,通道是双向的 ...

  4. Mybatis实现一对一查询 对ResultType和ResultMap分析

    实现一对一查询: ResultMap:使用ResultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加 列名对应的属性,即可完成映射. 如果没有查询结果的特殊要求建议使用Resul ...

  5. python相关性算法解决方案(rest/数据库/json/下载)

    1. 场景描述 一直做java,因项目原因,需要封装一些经典的算法到平台上去,就一边学习python,一边网上寻找经典算法代码,今天介绍下经典的相关性算法,算法原理就不介绍了,只从代码层面进行介绍,包 ...

  6. Go 面试每天一篇(第 1 天)

    下面这段代码输出的内容 package main import ( "fmt" ) func main() { defer_call() } func defer_call() { ...

  7. hdu 5902 GCD is Funny

    Problem Description Alex has invented a new game for fun. There are n integers at a board and he per ...

  8. moco 入门及问题解决

    废话不多说 下载: http://repo1.maven.org/maven2/com/github/dreamhead/moco-runner/ 选择最新版本下载jar包 启动: 1:在本地jar包 ...

  9. Python作业本——第5章 字典和结构化数据

    习题 1. {} 2. {'fow': 42} 3.字典是无序的 4.报错    (KeyError) 5.第一种是既搜索键又搜索值,第二种值搜索键    没有区别,in操作符检查一个值是不是字典的一 ...

  10. Linux系统安装配置curl

    1.获得安装包,从网上直接下载或者其他途径,这里直接wget wget http://curl.haxx.se/download/curl-7.20.0.tar.gz 2.解压到当前目录(或者 htt ...