Flask/Gunicorn服务如何自动重载以获取更新后的CSV数据?
解决Flask服务无法自动读取更新后CSV文件的问题
问题根源
你的代码在服务启动时就把CSV文件内容读取到全局变量bd、A、B中了,后续CSV文件更新后,这些变量不会自动重新读取,只有重启服务或触发重载时才会刷新,这就是返回旧数据的原因。
最优解决方案:将文件读取逻辑移至路由内部
把读取CSV和提取数据的代码放到路由函数里,这样每次请求都会重新读取最新的CSV文件,不需要重启或重载服务。修改后的代码如下:
from flask import Flask, request, jsonify import pandas as pd app = Flask(__name__) @app.route('/') def get_user(): # 每次请求时重新读取CSV文件 bd = pd.read_csv('File.csv') A = bd['A'][0] B = bd['B'][0] user_data = {'A': str(A), 'B': '+' + str(B)} return jsonify(user_data), 200 if __name__ == '__main__': app.run(host='0.0.0.0', port=8000)
你考虑的cron触发重载方法的可行性
这种方法可行但不推荐:
- 原理是Gunicorn默认会监控代码文件变化,当
app.py被修改(哪怕是无修改保存)时,会自动重启工作进程,从而重新读取CSV文件。 - 缺点是每次重载会导致服务短暂中断,影响用户请求;而且完全没必要为了更新数据而重启整个服务,属于过度操作。
进阶优化:文件变化监控(可选)
如果担心每次请求读取文件影响性能,可以用watchdog库监控CSV文件的变化,当文件更新时自动重新加载数据到内存:
- 安装依赖:
pip install watchdog - 示例代码:
from flask import Flask, request, jsonify import pandas as pd from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler # 初始化全局变量 bd = pd.read_csv('File.csv') A = bd['A'][0] B = bd['B'][0] app = Flask(__name__) # 定义文件变化监控处理器 class CSVUpdateHandler(FileSystemEventHandler): def on_modified(self, event): if event.src_path.endswith('File.csv'): global bd, A, B bd = pd.read_csv('File.csv') A = bd['A'][0] B = bd['B'][0] print("CSV文件已更新,重新加载数据") # 启动监控 event_handler = CSVUpdateHandler() observer = Observer() observer.schedule(event_handler, path='.', recursive=False) observer.start() @app.route('/') def get_user(): user_data = {'A': str(A), 'B': '+' + str(B)} return jsonify(user_data), 200 if __name__ == '__main__': try: app.run(host='0.0.0.0', port=8000) finally: observer.stop() observer.join()
这种方法既保证了数据实时更新,又避免了每次请求读取文件的开销,适合数据更新频率不高但对性能有要求的场景。
内容的提问来源于stack exchange,提问作者user24959239
相关产品推荐
相关产品推荐

