Timing is easy using a thread and time.sleep. The second example
encapsulates all that is required into a class.
The third shows how to make things interruptible.
timed_event.py
from time import sleep
from threading import Thread
def task():
sleep(10)
print("something")
Thread(target=task).start()
for i in range(20):
print("Waiting",i)
sleep(1)
print("done")
timed_event2.py
from time import sleep
from threading import Thread
import time
class Timed:
def __init__(self,target,delay,*args):
self.thread = Thread(target=self.task)
self.target = target
self.args = args
self.delay = float(delay)
def task(self):
time.sleep(self.delay)
self.target(*self.args)
def start(self):
self.thread.start()
def join(self):
return self.thread.join()
def task():
print("something")
Timed(task,5).start()
for i in range(10):
print("Waiting",i)
sleep(1)
print("done")
timed_event3.py
We test the shouldquit variable once per second. We allow for fractional delay time
by decrementing the delay time by one second each time and having a special case to handle
a fraction left over. That is, for a delay of 2.5 seconds, we sleep(1) twice so that the
remaining time is 0.5 seconds, and then sleep(0.5) for the final bit of the delay.
from time import sleep
from threading import Thread
import time
class Timed:
def __init__(self,target,delay,*args):
self.thread = Thread(target=self.task)
self.target = target
self.args = args
self.delay = float(delay)
self.shouldquit = False
def quit(self):
self.shouldquit = True
return self
def task(self):
while self.delay > 0:
if self.shouldquit:
print("Interrupted")
return
if self.delay < 1:
time.sleep(self.delay)
break
else:
self.delay -= 1
time.sleep(1)
self.target(*self.args)
def start(self):
self.thread.start()
return self
def join(self):
return self.thread.join()
def task():
print("something")
victim.quit()
def task2():
print("should not print")
Timed(task,2.5).start()
victim = Timed(task2,5).start()
for i in range(10):
print("Waiting",i)
sleep(1)
print("done")