Create a session state variable to save your work. Run other processes as normal but save the result to session state when done.
import concurrent.futures
from concurrent.futures import ProcessPoolExecutor
import time
import streamlit as st
if 'save' not in st.session_state:
st.session_state.save = []
def task(v):
"""session state does not work here"""
time.sleep(1)
return v * v
if __name__ == '__main__':
num_workers = 2
jobs = [1, 2, 3, 4, 5, 6, 7, 8, 9]
processed_jobs = []
start = st.button('start work')
if start:
with ProcessPoolExecutor(max_workers=num_workers) as executor:
for j in jobs:
pj = executor.submit(task, j)
processed_jobs.append(pj)
for future in concurrent.futures.as_completed(processed_jobs):
try:
res = future.result()
st.write(f'res: {res}')
# Incrementally save the completed task so far.
st.session_state.save.append(res)
except concurrent.futures.process.BrokenProcessPool as ex:
raise Exception(ex)
if len(st.session_state.save):
st.write('#### Completed Jobs')
st.write(f'{st.session_state.save}')