首页 > 其他分享 >架构和运行机制

架构和运行机制

时间:2024-10-22 11:22:44浏览次数:6  
标签:count 架构 st session 运行机制 Streamlit data 加载

本篇主要介绍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 = 0

st.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主要用于在用户的会话中共享变量和状态信息。它关注的是用户数据的持久性和在不同事件回调之间的数据一致性。

标签:count,架构,st,session,运行机制,Streamlit,data,加载
From: https://www.cnblogs.com/wang_yb/p/18492213

相关文章

  • Docker架构
    什么是Docker?Docker是一个用于开发、发布和运行应用程序的开放平台。Docker使您能够将应用程序与基础设施分离,从而更快速地交付软件。通过Docker,您可以像管理应用程序一样管理基础设施。利用Docker在代码发布、测试和部署方面的方法,您可以大大缩短从编写代码到在生产......
  • 对提供微信聊天背景图网站的架构与技术推测
    说明:该网站主要提供各种超高清的微信聊天背景图片,包括蓝天白云、沙漠、海洋、落日海岸等自然景观图片,同时还有一些如原神相关的图片分类。网站还提供每日超高清4K微信背景图推荐等内容。website: www.ccwallpaper.com网站架构方面-**分层架构**-**表现层**:负责展示图......
  • x86_64架构下交叉编译aarch64架构所使用的qt库
    本文基于qt版本5.12.8在x86_64位上交叉移植出aarch64架构使用的库一、编译环境x86_64uisrc@ubuntu:~$archx86_64uisrc@ubuntu:~$^Cuisrc@ubuntu:~$二、QT版本5.12.8下载解压wgethttp://download.qt.io/archive/qt/5.12/5.12.8/single/qt-everywhere-src-5.12.8......
  • 一文搞懂SaaS应用架构:应用服务、应用结构、应用交互设计
    大家好,我是汤师爷~今天系统性地聊聊SaaS应用架构设计。应用架构概述我们已经完成了SaaS系统的定位分析,明确了系统的目标和核心能力。这为接下来的应用架构设计奠定了基础。应用架构就像整个SaaS系统的骨架,决定了系统的整体结构和各个组件之间的关系。接下来,我们会深入探讨应用......
  • 探索ArkWeb的奥秘:架构了解与生命周期管理
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。ArkWeb(方舟Web)是华为鸿蒙Harmon......
  • 软件架构风格之MVC架构
    一、前言在序章中已经介绍了MVC架构,MVC即模型-视图-控制器模式,该架构的核心组件是模型(Model)、视图(View)、控制器(Controller),各个部件之间职责明确,以实现搞内聚低耦合的系统。Model层的作用和职责①表示应用程序的数据结构和业务逻辑;②包含用于访问、更改和保存数据的方法;③负责......
  • 【STC15】面向对象的.h/.c程序架构
    .h文件#ifndef__MAIN_H_#define__MAIN_H_/*Includes------------------------------------------------------------------*/#include<STC15.h>/*externvariables-----------------------------------------------------------*//*externfunctionprot......
  • 基于Lambda架构的大数据处理详解
    1.软件项目简介及工作职责在我参与的大数据开发项目中,主要是构建一个实时与离线数据处理并行的系统,以满足业务对高效数据处理和及时响应的要求。该系统旨在收集并处理来自多个数据源的实时和批量数据,主要处理流程分为实时流处理和批量离线处理。在项目中,我的主要工作职责......
  • 操作系统学习笔记-1.2操作系统的发展历程,运行机制
    文章目录批处理操作系统1.**单道(Single-ProgrammedSystem)**特点:举例:2.**多道(Multi-ProgrammingSystem)**特点:3.**单道与多道的对比**分时操作系统与实时操作系统1.**分时操作系统(Time-SharingOperatingSystem)**概念:特点:应用场景:举例:2.**实时操作系统(Real-Tim......
  • 单元化架构,分布式系统的新王!
    0关键收获单元化架构通过减少故障的爆炸半径来增加系统弹性单元化架构是那些任何停机时间都被认为是不可接受的,或者可以显著影响最终用户的系统的一个好选择单元化架构通过强制使用固定大小的单元作为部署单元,并倾向于扩展而不是扩展的方法,增强了微服务的可伸缩性模型单元化......