Поймать прерывание клавиатуры, чтобы остановить многопроцессорный рабочий Python от работы в очереди

Из нескольких сообщений, найденных на stackoverflow, я создал этот код.

сценарий

Я хочу иметь multiprocessing.queue, на котором несколько рабочихСлушать"

В случае прерывания клавиатуры основной процесс больше не должен помещать новые элементы в очередь, а с помощью сторожевых объектов рабочий должен быть грациозно остановлен.

проблема

Моя проблема с текущей версией, где я использую

signal.signal(signal.SIGINT, signal.SIG_IGN) 

Игнорировать Ctrl + C означает, что он также игнорируется основным процессом.

Есть идеи ? Нужно ли использовать многопроцессорный рабочий пул? Некоторые примеры показывают, что мне, возможно, придется. Могу ли я тогда использовать очередь?

from multiprocessing import Pool, Process,Queue
import time
import signal
# http://docs.python.org/3.1/library/multiprocessing.html#multiprocessing.Queue
# http://docs.python.org/3.1/library/multiprocessing.html#multiprocessing.Process


class Worker(Process):
    def __init__(self, queue,ident):
        super(Worker, self).__init__()
        # Ignore Signals
        signal.signal(signal.SIGINT, signal.SIG_IGN)
        self.queue= queue
        self.idstr= str(ident)
        print "Ident" + self.idstr

    def run(self):
        print 'Worker started'
        # do some initialization here

        print 'Computing things!'
        for data in iter( self.queue.get, None ):
            print "#" + self.idstr + " : " + str(data)
            time.sleep(5)
            print "#" + self.idstr + "Queue Size: " + str(self.queue.qsize())

        print "Worker Done"

#### Main ####
request_queue = Queue(10)

for i in range(4):
    Worker( request_queue,i ).start()

try:
    for data in range(1000000):
        request_queue.put( data )
        #print "Queue Size: " + str(request_queue.qsize())
        # Sentinel objects to allow clean shutdown: 1 per worker.
    for i in range(4):
        request_queue.put( None ) 

except KeyboardInterrupt:
    print "Caught KeyboardInterrupt, terminating workers"
    while  request_queue.empty()==False:
         request_queue.get()
    request_queue.put( None )    

Ответы на вопрос(2)

Ваш ответ на вопрос