奥特堡 发表于 2024-10-22 12:59:50

『玩转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]
查看完整版本: 『玩转Streamlit』--架构和运行机制