Joining threads but allowing signals to main thread?

Lloyd Zusman ljz at asfast.com
Thu Jan 11 01:43:44 EST 2007


I have a python-2.5 program running under linux in which I spawn a
number of threads.  The main thread does nothing while these subsidiary
threads are running, and after they all complete, the main thread will
then exit.

I know that I can manage this through the use of Thread.join(), but
when I do it as follows, the main thread doesn't respond to signals:

  import sys, time, signal, threading

  signaled = False

  class Signaled(Exception):
      pass

  def sighandler(signum, frame):
      global signaled
      print 'aborted!'
      signaled = True

  def sigtest():
      global signaled
      if signaled:
          raise Signaled

  def myfunc(arg):
      while True:
          try:
              sigtest()
              # do something
          except Signaled:
              return

  threads = []
  for a in sys.argv[1:]:
      t = threading.Thread(myfunc, args=(a,))
      threads.append(t)

  # do some initialization

  for s in (signal.SIGHUP,  \
            signal.SIGINT,  \
            signal.SIGQUIT, \
            signal.SIGTERM):
      signal.signal(s, sighandler)

  for t in threads:
      t.start()

  for t in threads:
      t.join()

  sys.exit(0)

However, if I get rid of the t.join() loop and replace the last three
executable lines of the program with these, the main thread responds to
signals just fine:

  ...

  while threading.activeCount() > 1:
      time.sleep(0.001)

  sys.exit(0)

Is there any way to allow my program to respond to signals without
having to busy-wait in the main thread?

Thanks in advance.


-- 
 Lloyd Zusman
 ljz at asfast.com
 God bless you.




More information about the Python-list mailing list