You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask服务与外部Python脚本共享可变变量问题求助

问题根源

Flask服务和你的外部脚本是两个独立的Python进程,各自拥有独立的内存空间。直接通过from app import user导入的只是脚本启动时的实例副本,Flask进程中对实例的修改不会同步到外部脚本的内存里,自然拿不到最新数据。

可行解决方案

方案1:用缓存/数据库实现进程间数据共享(推荐)

通过第三方存储(比如Redis、SQLite)作为数据中转,Flask把更新后的数据存进去,外部脚本从存储中读取最新值。这里以Redis为例:

步骤1:安装依赖

pip install redis

修改Flask应用(app.py)

from flask import Flask, request, render_template
import redis

app = Flask(__name__)
# 连接本地Redis实例(默认端口6379)
redis_client = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True)

@app.route('/', methods=["GET", "POST"])
@app.route('/index', methods=["GET", "POST"])
def index():
    if request.method == "POST":
        data = request.get_json()
        if "something" in data:
            # 将新值存入Redis
            redis_client.set("user_something", data["something"])
            # 如果需要主动通知外部脚本,可发布消息
            redis_client.publish("something_updates", data["something"])
    return render_template('index.html')

if __name__ == '__main__':
    app.run()

外部脚本代码

import redis

redis_client = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True)

# 方式1:主动轮询获取最新值
print("当前值:", redis_client.get("user_something"))

# 方式2:订阅Redis消息,实时接收变更(无需轮询)
pubsub = redis_client.pubsub()
pubsub.subscribe("something_updates")
print("等待接收数据变更...")
for message in pubsub.listen():
    if message['type'] == 'message':
        print("收到新值:", message['data'])

方案2:给Flask加接口,外部脚本通过HTTP请求获取数据

在Flask中新增一个接口专门返回something的最新值,外部脚本通过请求该接口拿到数据。

修改Flask应用(app.py)

from flask import Flask, request, render_template, jsonify

app = Flask(__name__)

class User:
    def __init__(self):
        self._something = 0

    @property
    def something(self):
        return self._something

    @something.setter
    def something(self, value):
        self._something = value

user = User()

@app.route('/', methods=["GET", "POST"])
@app.route('/index', methods=["GET", "POST"])
def index():
    if request.method == "POST":
        data = request.get_json()
        if "something" in data:
            user.something = data["something"]
    return render_template('index.html')

# 新增获取数据的接口
@app.route('/get-something', methods=["GET"])
def get_something():
    return jsonify({"something": user.something})

if __name__ == '__main__':
    app.run()

外部脚本代码

import requests

# 请求Flask接口获取最新值
response = requests.get("http://localhost:5000/get-something")
if response.status_code == 200:
    data = response.json()
    print("当前值:", data["something"])

方案3:使用进程共享内存(局限性大)

如果仅在单机器、单进程Flask场景下使用,可以用Python的multiprocessing模块实现共享内存,但Flask若以多进程模式启动(比如Gunicorn多进程),该方案会失效。

修改User类(user.py)

from multiprocessing import Value

class User:
    def __init__(self):
        # 使用共享整数存储值('i'表示整数类型)
        self._something = Value('i', 0)

    @property
    def something(self):
        # 加锁避免并发读写冲突
        with self._something.get_lock():
            return self._something.value

    @something.setter
    def something(self, value):
        with self._something.get_lock():
            self._something.value = value

外部脚本代码

from app import user

print("当前值:", user.something)
总结
  • 推荐用方案1(Redis缓存):支持实时推送、高性能,适合大多数生产场景。
  • 简单需求可选方案2(HTTP接口):实现成本低,无需额外依赖。
  • 方案3仅适合本地单进程测试场景,不推荐生产使用。

内容的提问来源于stack exchange,提问作者gio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 14:45:48