Caching across runs

Hello,

I’ve got to set up a caching mechanism in order to avoid too many API calls (i.e., running into rate limit). I have successfully set up caching by means of @st.cache for the API calls and it appears to be working during a single run of Streamlit. However, I also need to cache the data across multiple runs.

As it seems, each time I interact with the Streamlit frontend, a new run is initiated. That’s fine for me but it eats up the API rate rather quickly because through each run, a new API connection is initiated and the cache of the previous run is flushed.

Is it possible to somehow cache/share data across multiple Streamlit runs? That would be awesome!

Cheers!

Do you mean restarts of the python process?

It should be caching between interactions - what’s the code like that you’re caching?

The Streamlit session (streamlit run) keeps running. I meant for example pressing R on the frontend or selecting items in a Multiselect box. The page refreshes and the API client instances are all created anew, following that my caching, which is linked to the api client instance’s __hash__ function, is invalidated.

The API client instances are all initialized in my main.py's if __name__ == "__main__":... block. That block seems to be executed every time I interact with the frontend (pressing R and stuff, see above). So the question is more like, where do I have to initialize instances that I want to keep during interactions like that? The if ... __main__ block does not seem to be the appropriate place…

Ah so what you may want to do is put the API client instantiation into a cached function too.

@st.cache
def get_api_client():

You can set a TTL if the client needs refreshing occasionally.

1 Like

Awesome! I had to add a hash_func to it but it seems to be working like a charm now!

Thank you very much, that was basically what I was looking for. Sometimes you don’t see the forest for all the trees.

1 Like