import multiprocessing import os import signal import time class Sleeper(multiprocessing.Process): def __init__(self, exit_event): self.exit_event = exit_event super(Sleeper, self).__init__() self.daemon = True def run(self): while not self.exit_event.is_set(): time.sleep(1) class Waiter(multiprocessing.Process): def __init__(self, exit_event): self.exit_event = exit_event super(Waiter, self).__init__() self.daemon = True def run(self): self.exit_event.wait() if __name__ == '__main__': sleeper_exit_event = multiprocessing.Event() sleepers = [] for i in range(2): sleepers.append(Sleeper(sleeper_exit_event)) sleepers[i].start() time.sleep(1) os.kill(sleepers[0].pid, signal.SIGTERM) print("Setting sleeper exit event.") sleeper_exit_event.set() print("Event set - joining sleepers.") for s in sleepers: s.join() print("Sleepers joined.") waiter_exit_event = multiprocessing.Event() waiters = [] for i in range(2): waiters.append(Waiter(waiter_exit_event)) waiters[i].start() time.sleep(1) os.kill(waiters[0].pid, signal.SIGTERM) print("Setting waiter exit event.") waiter_exit_event.set() # blocks indefinitely print("Event set - joining waiters") for s in sleepers: s.join() print("Waiters joined.")