架构和运行机制

news/2024/10/22 11:26:44

本篇主要介绍Streamlit的核心架构和运行机制,

目的是希望朋友们能先从整体上宏观的了解Streamlit,利用它提供的机制开发性能更高效的应用。

1. 架构

Streamlit比较特殊,它对使用者来说是BS架构应用,而随开发者来说其实更像一个CS架构的应用。

为什么说Streamlit更像CS架构呢?

因为后端功能和前端UI部分都是用Python写,所以开发Streamlit应用时的感觉,就像开发桌面应用一样。

如果你有CS应用的开发经验,比如QT,.Net平台的winform或WPF等,那么开发Streamlit的应用会觉得非常亲切。

虽然最终是在浏览器中使用Streamlit应用,但是开发时完全不需要HTML、CSS或JavaScript等前端知识。

不过,Streamlit App部署之后,需要注意它BS应用的一面:

  1. Streamlit App发布之后是多用户使用的,根据预估的用户量考虑服务器的配置资源
  2. 用户端通过浏览器来使用Streamlit App,所以无法访问服务器的文件、目录或操作系统。
  3. 如果需要与任何外围设备(如摄像头)通信,则必须使用Streamlit命令或自定义组件,这些命令或组件将通过用户的浏览器访问这些设备

2. 运行流程

Streamlit的主要流程简单直接:

  1. 服务端通过streamlit run命令启动
  2. 初始化App页面
  3. 客户端打开浏览器访问
  4. 用户在浏览器中操作
  5. 服务端根据用户操作进行数据处理
  6. 处理之后更新页面
  7. 新的页面返回到浏览器

Streamlit App每次接收用户操作之后,会重新运行整个代码,然后将重新渲染的页面返回,

这样会带来两个显而易见的问题。

  1. 如果代码中加载了大量的数据,每次用户操作后都会重新加载数据,影响性能

比如:

import streamlit as st
import pandas as pd
from 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.index >= date_range[0]]
data = data[data.index <= date_range[1]]
st.table(data)

每次加载数据时,会显示数据加载的时间:st.text(f"加载数据时间:{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}")

每次移动日期范围时,都会重新加载整个数据。

  1. 多个用户操作直接如果有联系,操作之间的状态无法保持

比如:

count = 0
st.text(f"Click {count}")if st.button("ADD"): # 点击按钮时执行count += 1

点击上面的按钮ADD,文本显示的始终是:Click 0

因为,点击按钮时,执行count += 1之后,还会将整个代码重新执行,count=0 也被重新执行。

下一节介绍如何解决这两个问题。

3. 缓存和状态

解决Streamlit App的数据和状态无法保存的问题,就要用到缓存cache)和状态session)两个重要的功能。

首先,用缓存来改进上一节中的数据加载问题。

## 数据加载
@st.cache_data
def load_data():#... 省略 ...

修改方法非常简单,只要在原来代码中的load_data函数上面加一个装饰器@st.cache_data就足够了。

改进之后,移动日期范围时,加载数据时间一直没变,说明没有反复的加载数据。

接下来,用状态session)来修复上一节中计数无法增加的问题。

if "count" not in st.session_state:st.session_state.count = 0st.text(f"Click {st.session_state.count}")if st.button("ADD"):st.session_state.count += 1

把计数用的count放入st.session_state中。

st.session_state用于在用户的每次会话中共享变量,确保这些变量在重新运行时仍然可用。

4. 总结

本篇讨论了Streamlit的架构和运行机制,整体来看它的设计简单直接,很好理解。

随后介绍了Streamlit中的缓存cache状态session,它们在数据处理、存储和持久性方面有着重要作用。

使用时,注意区分缓存cache状态session的使用场景。

缓存cache主要用于提高应用性能,通过存储和重用之前计算过的结果来避免重复计算。它关注的是数据的处理效率和资源消耗;

状态session主要用于在用户的会话中共享变量和状态信息。它关注的是用户数据的持久性和在不同事件回调之间的数据一致性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/74558.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

ByteHouse直播预告:揭秘基于OLAP降本增效的四大硬招

在数字化转型浪潮中,企业数据量正以惊人的速度增长,随之而来的数据存储、处理与分析挑战也日益严峻。在这一背景下,如何既保障查询性能,又尽可能降低资源成本,已成为企业亟需解决的核心问题。为此,ByteHouse将于10月23日19:00举办线上直播活动,围绕“降本增效”话题,深…

【触想智能】工业一体机在数控设备上应用的要求分析

工业一体机是一种集成了计算机、运动控制、人机界面和各种输入输出接口的设备。它广泛应用于数控设备,如数控机床、机器人、自动化生产线等。触想工业一体机TPC-W400系列在数控设备上应用工业一体机可以提高生产效率、降低成本和改善生产质量,但是你知道工业一体机在数控设备…

PbootCMS 放在二级目录无法进行数据库备份的解决办法

1. 打开 DatabaseController.php 文件使用 FTP 客户端:使用 FTP 客户端(如 FileZilla)连接到你的服务器。 导航到网站根目录的 apps/admin/controller/system 文件夹。下载 DatabaseController.php 文件:下载 DatabaseController.php 文件到本地,以便备份和编辑。2. 编辑 …

PbootCMS放在二级目录无法进行数据库备份怎么办

问题表现当 PbootCMS 安装在二级目录时,无法进行数据库备份。原因数据库备份路径配置不正确,导致备份功能无法正常工作。解决方法修改 DatabaseController.php 文件中的备份路径配置,去掉路径前的斜杠 /。扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉…

Express的使用笔记 6 项目接口在postman中的统一管理

笔记5已经将一个项目的基本结构搭建完成了,还进行了一定的封装,使用postman调用接口的时候,为了更好的管理项目,我们可以创建一个collection,然后在里面创建不同主题的文件夹,盛放对应的请求,并在环境中配置基本路径。

PbootCMS如何开启手机访问

问题表现PbootCMS 默认支持自适应模板的手机端访问,但如果你的模板不是自适应的,需要开启独立手机版访问。原因默认情况下,PbootCMS 使用自适应模板来适配不同设备。如果模板不是自适应的,需要单独设置手机端模板。解决方法在全局配置中开启独立手机版,并在模板文件夹下新…

PbootCMS后台登录提示登录失败:您登录失败次数太多已被锁定怎么办

问题表现PbootCMS 后台登录时提示“登录失败: 您登录失败次数太多已被锁定”。原因由于多次登录失败,系统为了安全起见锁定了登录功能。解决方法删除根目录下的 runtime 文件夹。具体操作步骤 1. 使用 FTP 客户端连接到服务器打开 FTP 客户端:使用 FTP 客户端(如 FileZilla)…

深入解析Apache DolphinScheduler容错机制

简述 Apache Dolphinscheduler Master和Worker都是支持多节点部署,无中心化的设计。Master主要负责是流程DAG的切分,最终通过RPC将任务分发到Worker节点上以及Worker上任务状态的处理 Worker主要负责是真正任务的执行,最后将任务状态汇报给Master,Master进行状态处理那问题…