FW: [Tutor] Multi-Threading and KeyboardInterrupt

Strax-Haber, Matthew (LARC-D320) matthew.strax-haber at nasa.gov
Thu Jun 11 15:44:24 CEST 2009


I sent this to the Tutor mailing list and did not receive a response.
Perhaps one of you might be able to offer some sagely wisdom or pointed
remarks?

Please reply off-list and thanks in advance. Code examples are below in
plain text.

------ Forwarded Message
> From: Matthew Strax-Haber <strax-haber.m at neu.edu>
> Reply-To: Matthew Strax-Haber <Matthew.Strax-Haber at nasa.gov>
> Date: Tue, 9 Jun 2009 22:01:33 -0500
> To: Python Tutor <tutor at python.org>
> Subject: [Tutor] Multi-Threading and KeyboardInterrupt
> 

> Hey everyone,
> 
> I hope one of you can help me with this. This is my first foray into
> multi-threaded programming. I have tried to boil my code down to it's
> simplest demonstrative form.
> 
> My program runs interactively by allowing the user to directly
> interact with the python prompt. This program has a runAll() method
> that runs a series of subprocesses with a cap on how many instances
> are running at a time. My intent is to allow the user to use Ctrl-C to
> break these subprocesses. Note that while not reflected in the demo
> below, each subprocess needs to be able to run clean-up code before
> shutting down (in single-threaded mode I just wrap in try-finally).
> When I run DB.py, and interrupt it with Ctrl-C, things do not run so
> cleanly. Please let me know what I can change to make this work
> properly. My intent is to have the following output:
> 
> 'key interrupt 1'
> 'key interrupt 2'
> 'key interrupt 3'
> 'key interrupt 4'
> '********* stopped midway ********'
> 
> Here is the code for a demo:
> ##############################################################################
> DB.py (run this):
> ##############################################################################
#!/usr/bin/env python

from subprocess    import Popen
from threading    import Thread, Semaphore

MAX_SUBPROCS    = 3
RUN_PERMISSION    = Semaphore(MAX_SUBPROCS)

def runSingle(i):
    with RUN_PERMISSION:
        Popen(['./Sub.py', str(i)]).wait()
        
def runAll():
    workers = [ Thread(target = runSingle, args = [i])
            for i in xrange(MAX_SUBPROCS + 1) ]
    try:
        for w in workers:
            w.start()
    except KeyboardInterrupt:
        ## I want this to be shown on a KeyboardInterrupt
        print '********* stopped midway ********'
    for w in workers:
        w.join()
            
runAll()
> ##############################################################################
> Sub.py (called by DB.py):
> ##############################################################################
#!/usr/bin/env python

import sys, time

try:
        while True: pass
except KeyboardInterrupt:
        print 'key interrupt %s' % sys.argv[1]
        raise
> ##############################################################################
> _______________________________________________
> Tutor maillist  -  Tutor at python.org
> http://mail.python.org/mailman/listinfo/tutor
> 

------ End of Forwarded Message




More information about the Python-list mailing list