I have some python code I'm writing that's interfacing real-world hardware.  It's replacing a hardware PLC.  What I'm planning is when an event trigger happens to kick off multiple threads to effect certain 'on' actions, then go to sleep for a set interval, and then perform the corresponding 'off' actions.  For example:  at trigger, spawn a thread that turns the room lights on.  Then go to sleep for 20 minutes.  Then turn the lights off and terminate the thread.
However, I will have situations where the event trigger re-occurs.  In that scenario I want the entire sequence to start over.  My original plan was to use threads with unique names, so if a trigger occurs, check if the 'lights' thread exists, if if does kill it, and then re-spawn a new 'lights' thread.  But in researching around these parts, it seems like people are suggesting that killing a thread is a Very Bad Thing to do.  
So what would a better approach be to handling my situation?  Note that in my example I only talked about one thread- but in reality there will be many different threads controlling many different devices.
This is python 3.x on a Rapberry Pi running raspbian, using rpi.gpio to monitor my input triggers and an I2C relay board for my output devices in case any of that info is useful.  
Thanks!
the reason for not killing off threads is that it's easy to do it in a way that doesn't give the code any chance to "clean up" appropriately.  i.e. finally blocks not run, resources leaked, etc…
there are various ways to get around this, you could wait on an Event as suggested by @Jérôme, treating a timeout as a signal to carry on
asyncio is another alternative as Cancelled exceptions tend to get used to clean up nicely and don't have the problems associated with killing native threads
Best way to restart (from beginning) a thread that is sleeping?