import random import signal import threading import time class EvilThread(threading.Thread): def coroutine(self): while True: letter = "#" if self.daemon else "." print(letter, end="", flush=True) try: raise ValueError() except ValueError as exc: delay = random.randint(1, 100) / 1000 time.sleep(delay) else: delay = random.randint(1, 100) / 1000 time.sleep(delay) yield def run(self): gen = self.coroutine() for it in gen: pass def main(): def killer(signum, frame): raise KeyboardInterrupt() threads = [EvilThread() for index in range(10)] #for thread in threads[:len(threads)//2]: # thread.daemon = True for thread in threads: thread.start() signal.signal(signal.SIGALRM, killer) signal.alarm(1) main()