Interrupción del teclado con multiprocesamiento de python.

Tengo problemas al manejar con gracia una interrupción del teclado con el multiprocesamiento de python

(Sí, sé que Ctr-C no debería garantizar un cierre correcto, pero dejemos esa discusión para un tema diferente)

Considere el siguiente código, donde soy usuario unmultiprocessing.Manager#list() que es un ListProxy que entendí que maneja el acceso multiproceso a una lista.

Cuando presiono Ctr-C fuera de esto, obtengo unsocket.error: [Errno 2] No such file or directory al intentar acceder al ListProxy

Me encantaría que la lista compartida no se corrompa en Ctr-C. ¡¿Es posible?!

Nota: quiero resolver esto sin usar grupos y colas.

from multiprocessing import Process, Manager
from time import sleep

def f(process_number, shared_array):
    try:
        print "starting thread: ", process_number
        shared_array.append(process_number)
        sleep(3)
        shared_array.append(process_number)
    except KeyboardInterrupt:
        print "Keyboard interrupt in process: ", process_number
    finally:
        print "cleaning up thread", process_number

if __name__ == '__main__':

    processes = []

    manager = Manager()
    shared_array = manager.list()

    for i in xrange(4):
        p = Process(target=f, args=(i, shared_array))
        p.start()
        processes.append(p)

    try:
        for process in processes:
            process.join()
    except KeyboardInterrupt:
        print "Keyboard interrupt in main"

    for item in shared_array:
        # raises "socket.error: [Errno 2] No such file or directory"
        print item

Si ejecuta eso y luego presiona Ctr-C, obtenemos lo siguiente:

starting thread:  0
starting thread:  1
starting thread:  3
starting thread:  2
^CKeyboard interupt in process:  3
Keyboard interupt in process:  0
cleaning up thread 3
cleaning up thread 0
Keyboard interupt in process:  1
Keyboard interupt in process:  2
cleaning up thread 1
cleaning up thread 2
Keyboard interupt in main
Traceback (most recent call last):
  File "multi.py", line 33, in <module>
    for item in shared_array:
  File "<string>", line 2, in __getitem__
  File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/managers.py", line 755, in _callmethod
    self._connect()
  File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/managers.py", line 742, in _connect
    conn = self._Client(self._token.address, authkey=self._authkey)
  File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/connection.py", line 169, in Client
    c = SocketClient(address)
  File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/connection.py", line 293, in SocketClient
    s.connect(address)
  File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 2] No such file or directory

(Aquí hay otro enfoque utilizando unamultiprocessing.Lock con afecto similar ...esencia) Preguntas similares:

Detenga la interrupción del teclado para evitar que el trabajador de multiprocesamiento de Python trabaje en la colaInterrupciones del teclado con el grupo de multiprocesamiento de pythonVariable compartida en multiproceso de python

Respuestas a la pregunta(2)

Su respuesta a la pregunta