Timeout a streamlit webapp after certain time


How do I make my streamlit webapp timeout after certain time of inactivity by user on Windows & Unix systems.

Expected behavior:

User opens the webapp, leaves the tab running with no activity for some time. Streamlit script should close (st.stop() maybe) after a certain amount of time.

Debug info

  • Streamlit version: 1.27.0
  • Python version: 3.7.6
  • Using Conda? PipEnv? PyEnv? Pex?
  • OS version: Windows 10
  • Browser version: Chrome 83.0.4103.116

Additional information

Since I couldnt find anything inbuilt related to this, i tried to find if i can timeout a function instead.
I found this stackoverflow thread which i thought could be useful.
Here, i found the 3rd highest answer by user “Russia Must Remove Putin”

His solution involved using a @exit_after decorator to timeout a function.

While this solution did work somewhat it isnt what i intended to do. When i used this decorater, instead of timing out that particular function which it wrapped around & stopping its execution. It stopped the whole Streamlit app running in my terminal.

I had to run the command “streamlit run my_file.py” to get it back up.

What i need is for the streamlit script to run the st.stop() command after certain minutes of inactivity by user.

How would that be useful? Do you want to interrupt an infinite loop or a long running task?

So, I am making this script to serve as an Webapp for doing server related tasks like status checks, etc. I have made functions for each of my tasks & they work as intended.

After i have done my tasks( number of tasks & its order are not predefined), i click “Logout” button on my UI to stop the script & send me an summary of whatever i have done in this session( i achieve this my storing a string in session state). The summary is sent via mail from python. This thing works as expected on logout button click.

Now i want to add timeout functionality to this for a case where I (user) forgets to logout (stop it).

I want to add my timeout functionality to basically stop the session/ browser tab after some time of inactivity & send me the summary after stopping the session.

@Sanchit_Rabadey have u considered:

  1. Checking user timout logic in a separate thread: if the user times out: pushing True to queue.Queue()
  2. Define a parent decorator function (lets call it- “check_user_timeout”): that checks if queue is empty or not : and if its non-empty: then calls st.stop()
  3. wrapping ur logics inside @check_user_timeout