Interrupting Python raw_input () en un hilo secundario con ^ C / KeyboardInterrupt

En un programa Python multiproceso, un subproceso a veces solicita la entrada de la consola utilizando el @ incorporaDatos crudos(. Me gustaría poder cerrar el programa en un indicador raw_input escribiendo ^ C en el shell (es decir, con una señal SIGINT). Sin embargo, cuando el subproceso secundario está ejecutando raw_input, escribir ^ C no hace nada: KeyboardInterrupt no se activa hasta que presione return (dejando raw_input).

Por ejemplo, en el siguiente programa:

import threading

class T(threading.Thread):
    def run(self):
        x = raw_input()
        print x

if __name__ == '__main__':
    t = T()
    t.start()
    t.join()

Typing ^ C no hace nada hasta que finaliza la entrada. Sin embargo, si solo llamamos aT().run() (es decir, el caso de subproceso único: simplemente ejecute raw_input en el subproceso principal), ^ C cierra el programa inmediatamente.

Presumiblemente, esto se debe a que SIGINT se envía al subproceso principal, que se suspende (esperando el GIL) mientras se lee el subproceso bifurcado en la consola. El subproceso principal no puede ejecutar su controlador de señal hasta que agarra el GIL después de que retorna raw_input. (Corríjame si me equivoco al respecto; no soy un experto en la implementación de subprocesos de Python).

¿Hay alguna manera de leer desde stdin de una manera similar a la entrada sin procesar mientras se permite que SIGINT sea manejado por el hilo principal y, por lo tanto, anule todo el proceso?

[He observado el comportamiento anterior en Mac OS X y algunos Linuxes diferentes.]

Editar He caracterizado mal el problema subyacente anterior. En una investigación adicional, es la llamada del hilo principal ajoin() eso impide el manejo de la señal: el propio Guido van Rossum ha explicado queel bloqueo subyacente adquirido en join es ininterrumpible. Esto significa que la señal se difiere hasta que finaliza todo el hilo, por lo que esto realmente no tiene nada que ver conraw_input en absoluto (solo el hecho de que el subproceso de fondo está bloqueando para que la unión no se complete).

Respuestas a la pregunta(4)

Su respuesta a la pregunta