如何每秒运行一次与Flask上的请求分开的函数?

时间:2015-03-08 14:42:00

标签: python flask

我正在使用Flask开发一个简单的API,它不是REST或其他任何东西。

有一个模块可以在列表中返回实时数据。

有问题的模块

# module.py
def get_data():
    do_something()
    return [info_from_somewhere, info_from_other_place]

和应用

# app.py
import module

@app.route('/')
def get_data():
    return jsonify(data=module.get_data()[0])

问题是,每当有人请求该路由时,这将运行该函数。由于数据只适用于所有数据,我想为每个请求提供数据,但只运行一次。

编辑:我试过了:

got_data = module.get_data()

@app.route('/')
def get_data():
    return jsonify(data=got_data[0])

可以使用,但不要刷新列表。所以我的问题是“我怎么能每秒刷新一次?”我试过睡觉,但冻结了我的应用

1 个答案:

答案 0 :(得分:4)

您可以使用celery实现此目的。从项目页面。

  

Celery是基于分布式消息传递的异步任务队列/作业队列。它专注于实时操作,但也支持调度。

其他解决方案可以通过生成一个线程来完成,这会每秒更新一次数据,但这可能会非常快速。

from threading import Timer
from flask import Flask

app = Flask(__name__)
DATA = "data"

def update_data(interval):
    Timer(interval, update_data, [interval]).start()
    global DATA
    DATA = DATA + " updating..."

# update data every second
update_data(1)

@app.route("/")
def index():
    return DATA

if __name__ == "__main__":
    app.run(debug=True)