Run long running tasks (like embedding of large docs) asynchronously without blocking UI and notify user when finished


I need to run long running tasks (like vector embeddings of large documents) in Streamlit without blocking the user interface. How to properly do this?

Additional information

I have been reading about using Streamlit asynchronously for the past several days but to me as a newbie (both Streamlit and Python) it is not obvious how to do a simple task: user uploads several large documents that need to be embedded using ChatGPT API calls. This runs a long time and I want to offer the user to do something else in the mean time (run this embedding process in the background) and just notify the user when finished (successful or with an error) using st.status.

Thanks for any comments or pointers where the solution for this is being shown.

Hi @Sam_H,

Thanks for posting!

The issue you’re running into is that Streamlit reruns the page from top to bottom each time there’s an interaction on the app. So if there’s another process running then a user clicks on another element on the page, the app will rerun the code from top to bottom again.

Hi @Sam_H I haven’t done this but Python handles asynchronous events using asyncio

You could give that a try?

Any update on this? This is a perfect use case. Surprised it is not supported oob.