I’ve got an event-driven chatbot and I’m trying to implement spam protection. I want to silence a user who is behaving badly for a period of time, without blocking the rest of the application.
Here’s what doesn’t work:
if user_behaving_badly():
ban( user )
time.sleep( penalty_duration ) # Bad! Blocks the entire application!
unban( user )
Ideally, if user_behaving_badly() is true, I want to start a new thread which does nothing but ban the user, then sleep for a while, unban the user, and then the thread disappears.
According to this I can accomplish my goal using the following:
if user_behaving_badly():
thread.start_new_thread( banSleepUnban, ( user, penalty ) )
“Simple” is usually an indicator of “good”, and this is pretty simple, but everything I’ve heard about threads has said that they can bite you in unexpected ways. My question is: Is there a better way than this to run a simple delay loop without blocking the rest of the application?
Use a threading timer object, like this:
Then only unban is run in the thread.