Shutting worker threads down gracefully after signal, portably

D

Duncan Findlay

Suppose I've got a Python daemon that spawns a bunch of worker threads, waits for a singal (e.g. SIGTERM) and then shuts down the worker threads gracefully. What's the simplest way to do the signal handling portably across as many operating systems as possible (at least Linux and FreeBSD). Specifically, I'm interested in solutions where the main thread consumes no CPU, so no time.sleep(n) loops.

The most obvious solution (below) does not work with on FreeBSD, because the signal gets delivered to a different thread and signal.pause() doesn't return.

_shutdown = False

def sig_handler(signum, frame):
print 'handled'
global _shutdown
_shutdown = True

if __name__ == '__main__':

# Set up signal handling.
signal.signal(signal.SIGTERM, sig_handler)

# Start worker threads.
workers = [Worker() for i in xrange(NUM_THREADS)]
for worker in workers:
worker.start()

# Sleep until woken by a signal.
while not _shutdown:
signal.pause()

# Shutdown work threads gracefully.
for worker in workers:
worker.shutdown()

Any ideas? I've attached a more complete code sample.

Thanks
Duncan Findlay
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads

Threads and signals 1

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,062
Latest member
OrderKetozenseACV

Latest Threads

Top