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

如何让独立循环的Python脚本与Flask应用实现数据交互?

解决Flask应用与数据生成脚本的联动问题

嘿,我来帮你搞定这个问题!首先得指出你原来代码里的一个小问题:Flask的路由函数hello_world不能直接定义参数myData——Flask的路由函数默认只能接收URL路径里的参数,所以得换个方式共享数据。下面给你几种实用的方案,按需选择:

方案1:整合到Flask后台线程(最简单)

如果不需要两个完全独立的脚本,直接把数据生成逻辑放到Flask的后台线程里是最省心的方式,用全局变量共享数据即可:

from flask import Flask
import threading
import time

app = Flask(__name__)
myData = 0  # 全局共享变量,存储最新生成的数据

def get_data():
    # 这里替换成你实际的数据生成逻辑,比如调用外部接口、读取传感器等
    return int(time.time()) % 100  # 模拟生成数据

def generate_data_loop():
    global myData
    while True:
        myData = get_data()
        time.sleep(1)  # 控制数据生成的频率,根据实际需求调整

@app.route('/')
def hello_world():
    # 直接返回最新的myData
    return f"当前数据:{str(myData)}"

if __name__ == '__main__':
    # 启动后台数据生成线程,daemon=True表示线程随主程序退出而结束
    data_thread = threading.Thread(target=generate_data_loop, daemon=True)
    data_thread.start()
    app.run(host='0.0.0.0', port=5000)

注意事项:

  • 如果get_data()是耗时操作,或者有多个线程同时修改myData,建议加线程锁保证安全:
    from threading import Lock
    data_lock = Lock()
    
    # 在生成数据时:
    with data_lock:
        myData = get_data()
    
    # 在Flask路由里读取时:
    with data_lock:
        current_data = myData
    return f"当前数据:{str(current_data)}"
    

方案2:用Redis消息队列(适合完全独立的脚本)

如果你必须保持两个脚本完全独立(比如数据生成脚本和Flask运行在不同进程/机器),用Redis作为中间存储是个靠谱的选择:

第一步:安装Redis

先安装Redis服务(根据你的操作系统安装,比如Ubuntu用sudo apt install redis-server,Windows可以下载官方安装包),然后安装Python的Redis客户端:

pip install redis

数据生成脚本(独立运行)

import redis
import time

# 连接本地Redis,根据实际地址修改
r = redis.Redis(host='localhost', port=6379, db=0)

def get_data():
    # 替换成你的实际数据生成逻辑
    return int(time.time()) % 100

while True:
    myData = get_data()
    r.set('latest_data', myData)  # 将数据存入Redis的键值对
    time.sleep(1)

Flask应用脚本(独立运行)

from flask import Flask
import redis

app = Flask(__name__)
r = redis.Redis(host='localhost', port=6379, db=0)

@app.route('/')
def hello_world():
    # 从Redis读取最新数据
    myData = r.get('latest_data')
    if myData:
        return f"当前数据:{myData.decode('utf-8')}"
    else:
        return "暂无数据"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

方案3:用文件共享数据(轻量简单场景)

如果不想依赖额外服务,用本地文件作为数据中转也是可行的,适合低并发的简单场景:

数据生成脚本(独立运行)

import time
import os

def get_data():
    # 替换成你的实际数据生成逻辑
    return int(time.time()) % 100

while True:
    myData = get_data()
    # 先写入临时文件,再重命名避免读写冲突
    with open('data_temp.txt', 'w') as f:
        f.write(str(myData))
    # 重命名操作是原子性的,不会出现Flask读到半写状态的文件
    os.replace('data_temp.txt', 'data.txt')
    time.sleep(1)

Flask应用脚本(独立运行)

from flask import Flask
import os

app = Flask(__name__)

@app.route('/')
def hello_world():
    data_file = 'data.txt'
    if os.path.exists(data_file):
        with open(data_file, 'r') as f:
            myData = f.read().strip()
        return f"当前数据:{myData}"
    else:
        return "暂无数据"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

注意事项:

  • 用文件共享时,一定要用原子性的文件替换操作(比如os.replace),避免Flask读取到不完整的数据。
  • 高并发场景下不建议用这种方式,性能和可靠性不如Redis。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:39:31