『玩转Streamlit』--架构和运行机制
本篇主要介绍Streamlit的核心架构和运行机制,目的是希望朋友们能先从整体上宏观的了解Streamlit,利用它提供的机制开发性能更高效的应用。
1. 架构
Streamlit比较特殊,它对使用者来说是BS架构应用,而随开发者来说其实更像一个CS架构的应用。
为什么说Streamlit更像CS架构呢?
因为后端功能和前端UI部分都是用Python写,所以开发Streamlit应用时的感觉,就像开发桌面应用一样。
如果你有CS应用的开发经验,比如QT,.Net平台的winform或WPF等,那么开发Streamlit的应用会觉得非常亲切。
虽然最终是在浏览器中使用Streamlit应用,但是开发时完全不需要HTML、CSS或JavaScript等前端知识。
不过,Streamlit App部署之后,需要注意它BS应用的一面:
[*]Streamlit App发布之后是多用户使用的,根据预估的用户量考虑服务器的配置资源
[*]用户端通过浏览器来使用Streamlit App,所以无法访问服务器的文件、目录或操作系统。
[*]如果需要与任何外围设备(如摄像头)通信,则必须使用Streamlit命令或自定义组件,这些命令或组件将通过用户的浏览器访问这些设备
2. 运行流程
Streamlit的主要流程简单直接:
[*]服务端通过streamlit run命令启动
[*]初始化App页面
[*]客户端打开浏览器访问
[*]用户在浏览器中操作
[*]服务端根据用户操作进行数据处理
[*]处理之后更新页面
[*]新的页面返回到浏览器
Streamlit App每次接收用户操作之后,会重新运行整个代码,然后将重新渲染的页面返回,
这样会带来两个显而易见的问题。
[*]如果代码中加载了大量的数据,每次用户操作后都会重新加载数据,影响性能
比如:
import streamlit as stimport pandas as pdfrom datetime import datetime## 数据加载def load_data(): df = pd.DataFrame() df.index = pd.date_range("2024/10/01", periods=20) df["A"] = range(20) df["B"] = range(20) st.text(f"加载数据时间:{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}") return df# 加载数据data = load_data()date_range = st.slider( "日期范围", min_value=datetime(2024, 10, 1), max_value=datetime(2024, 10, 20), value=(datetime(2024, 10, 1), datetime(2024, 10, 20)),)data = data]data = data[data.index
页:
[1]