Streamlit patterns

Named task per session

import streamlit as st
import asynclit

tasks = asynclit.session_tasks(st.session_state)
if "load" not in tasks:
    tasks["load"] = asynclit.run(load_data)

task = tasks["load"]
if task.done:
    st.write(task.result)
else:
    st.write("Loading…")

Observed output in tests/streamlit_apps/asynclit_poll_app.py (AppTest runs):

run 0 ['wait']
run 1 ['ready:138']
... last ['ready:138']

Progress streaming (async only)

import streamlit as st
import asynclit

async def job(queue, n: int) -> int:
    for i in range(n):
        await queue.async_q.put(i)
    return n

tasks = asynclit.session_tasks(st.session_state)
tasks.setdefault("job", asynclit.run(job, 5))

task = tasks["job"]
for x in task.progress:
    st.write(f"tick: {x}")
if task.done:
    st.write(f"done: {task.result}")

Observed output in tests/streamlit_apps/asynclit_progress_app.py (AppTest runs):

run 0 ['started']
run 1 ['tick:0', 'tick:1', 'tick:2', 'tick:3', 'done:4']
... last ['done:4']