未提供项目描述
项目描述
streamlit-sync
一个用于在streamlit会话之间轻松同步仪表板的库。
import streamlit as st
import streamlit_sync
room_name = streamlit_sync.select_room_widget()
with streamlit_sync.sync(room_name):
y = st.slider("Select a value")
st.write(y, "squared is", y * y)
更完整的示例应用程序可以在./toy_example.py
中找到。
为什么?
最初的目标是能够共享一个任何人都可以交互的仪表板。每个用户都可以看到其他用户对其仪表板的影响。
潜在用例包括
- 在会议/演示中,它可以作为一个解决方案,避免让一个用户与所有人共享其屏幕并进行所有操作。
- 可以通过这种方式实现小型游戏或聊天。
- 它可以是一种“保存”本地演示中精确有趣参数的方法。目前,无法在本地驱动器上存储会话,但这应该是一个简单的改进。
- 等。
免责声明
自行承担使用风险
streamlit-sync
使用Streamlit的内部API,这些API并非面向公众。不能保证它在未来的版本中可以正常工作。streamlit-sync
并非特别高效。同步版本的仪表板是使用streamlit缓存的更好激励。- 当与大量并发会话一起使用时,此库的健壮性不能保证。
streamlit-sync
没有经过充分的测试。它需要进行具有多个会话的端到端测试,但这尚未完成。
相关工作
(streamlit-server-state)是另一个做类似工作的库。它用于在服务器端状态。`streamlit-sync`的想法是同步小部件本身。
特性
线程安全
每个房间使用自己的锁(来自python threading
库)。每次只能有一个会话可以读写房间中的值。我不知道如果大量会话连接到同一房间,这将如何影响可用性。
每个房间都会在内存中保存带有时间戳的最新值快照。一个会话只有在已经拥有最新数据的情况下才能更新值。这意味着如果两个不同的会话同时在对仪表板进行操作,则很可能有一个操作会丢失。
如何处理房间?
为了同步数据,您需要进入一个房间。最简单的方法是让每个会话使用同一个房间。
import streamlit as st
import streamlit_sync
with streamlit_sync.sync("default_room"):
app()
从UI中选择房间
使用默认UI
另一种选择是使用 streamlit_sync.select_room_widget()
方法直接从UI中选择要进入的房间。它将在侧边栏创建一个简单的表单,您可以从列表中选择一个现有房间或创建一个新的房间。一旦进入房间,您就可以退出。房间中的值仍然保存在服务器上,但已从会话中删除。
import streamlit as st
import streamlit_sync
room_name = streamlit_sync.select_room_widget()
with streamlit_sync.sync(room_name):
app()
注意:每个房间活跃会话的数量仅供参考,不一定总是准确。如果会话关闭,服务器只有在另一个会话触发了该房间的同步时才会注意到。
构建自己的UI
除了使用带有 select_room_widget
的默认UI,您还可以使用 streamlit_sync.rooms.enter_room(room_name)
和 streamlit_sync.rooms.exit_room()
构建自己的UI。
如何仅同步特定的小部件/值?
默认情况下,所有小部件和值都会同步。您可以通过定义自己的非同步密钥将某些小部件限制为“私有”。
x = st.slider("Select a value", key=streamlit_sync.get_not_synced_key("key"))
对于状态值,这也是可能的。
synced_key = "my_custom_key"
username = streamlit_sync.get_not_synced_key("username")
st.session_state[synced_key] = 42 # All sessions will be synced with this value
st.session_state[username] = "Adrien Treuille" # Each session can store its own username
动作小部件
一些小部件在 streamlit-sync 中的处理方式略有不同,特别是按钮和表单。
按钮
为了避免重复操作,按钮永远不会与房间同步。为了同步按钮,您需要设置一个状态值。
在这个例子中,气球只会在点击按钮的会话中发送。
# Action is not shared !
if st.button(label="Send balloons"):
st.balloons()
以下是一个同步操作结果的示例。
# Nb of clicks is synced, not the action. !
if st.session_state.get("NB_CLICKS") is None:
st.session_state["NB_CLICKS"] = 0
if st.button(label="click"):
st.session_state["NB_CLICKS"] += 1
st.write("Clicked **" + str(st.session_state["NB_CLICKS"]) + "** times !")
表单
只有在提交按钮被点击时,表单数据才会同步,这正是表单的预期用途。与按钮类似,“提交操作”不会同步,只有数据会同步。
注意:当前存在一个关于表单同步的bug。字段只在提交数据的会话中被清除。
未来改进
- 测试库,特别是UI。目前,两个会话之间的同步只是手动测试的。
- 提供一个选项,默认同步或不同步值。目前,默认同步所有值,除非明确指出为“不同步”。如果能够选择性地将所有值设置为私有,除非明确同步,那就更好了。
- 将状态存储在本地驱动器上。这是我构建这个工具的主要目的之一。想法是能够存储和检索 streamlit 会话,即使是在重启之后。这很可能会在可序列化的数据上工作。
- 有一个读写/只读机制,允许某些“管理员会话”与小部件交互,而某些“普通用户”只能看到当前的仪表板。
- 欢迎提出其他想法:)
项目详情
下载文件
根据您的平台下载文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。
源分布
构建分布
streamlit_sync-0.1.0.tar.gz 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d32ae0f9bf0ffe78295b028cc60e066333456a0ca2e248b6c2d8c381316412eb |
|
MD5 | c60994381f72922d1f430668e004d1b4 |
|
BLAKE2b-256 | b46f87a2da9d8f8e07d57efa57af1fa0ecc27da2aa132b19642299b44684b174 |
streamlit_sync-0.1.0-py3-none-any.whl 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | bb68df86cba826219262bb2b98f2cda658ab0d5f0e4c0548cc9e56e8fc443543 |
|
MD5 | 73179485deccd3cad58fa6d1d756a753 |
|
BLAKE2b-256 | 7779b12fbc5daa152723a336ffdd15d75d816be11beb3179d9cc5872f76258fe |