2010-06-30 12 views
5

Parece que IDLE (parte de la instalación estándar de Python Windows) no ejecutará programas de subprocesamiento múltiple correctamente sin cuelgues desagradables o bloqueos de errores. ¿Alguien sabe de una manera de arreglar esto?Python ¿IDLE compatible con multihilo?

El siguiente programa siempre va a colgar en IDLE pero completa normalmente cuando se ejecuta con el intérprete de Python directamente: salida

import threading, time 

printLock = threading.Lock() 

def pl(s): 
    printLock.acquire() 
    print s 
    printLock.release() 

class myThread(threading.Thread): 
    def run(self): 
    i = 0 
    for i in range(0,30): 
     pl(i) 
     time.sleep(0.1) 

t = myThread() 
t.start() 

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

print "all done!" 

muestra:

U:\dev\py\multithreadtest>python mt.py 
0 
1 
2 
3 
4 
5 
6 
7 
8 
9 
1277935368.84 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
1277935369.84 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
1277935370.84 
1277935371.84 
all done! 

salida al usar IDLE "Ejecutar Módulo" función siempre se cuelga indefinidamente cuando la línea que lee 23 o 24 aparece en mi máquina.

Respuesta

2

AFAIK es un juego de azar cuando se ejecuta el código de subproceso en IDLE. IDLE utiliza el GIL liberalmente, por lo que las condiciones de carrera y los puntos muertos son comunes. Lamentablemente, no estoy lo suficientemente versado en el hilo para ofrecer una idea sobre cómo hacer que este hilo sea seguro, más allá de lo obvio.

+2

IDLE está escrito en Tkinter, no en WxPython. –

+0

Inactivo está escrito en Python y el código de Python no usa directamente el GIL. AFAIK, el uso de Idle del módulo de subprocesos está limitado a las clases de Subprocesamiento y Condición y a la función de subproceso actual. –

1

IDLE tiene algunos problemas conocidos a la hora de enhebrar. No sé una cantidad abrumadora sobre los detalles de por qué es un problema, porque hago todo lo posible para mantenerme alejado de IDLE, pero sé que lo es. Le sugiero encarecidamente que obtenga IronPython y las herramientas de Python para Visual Studio. Las herramientas de depuración de VS son absolutamente inigualables, especialmente dada la gran biblioteca de complementos.

1
import threading 
print(threading.activeCount()) 

imprime 1 cuando se ejecuta en la línea de comandos, 2 cuando se ejecuta desde Idle. Por lo tanto, su bucle

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

terminará en la consola pero continuará siempre en modo Inactivo.

Para solucionar el problema en el código publicado, añadir algo como

initial_threads = threading.activeCount() 

después de la importación y cambiar la cabecera del bucle a

while threading.activeCount() > initial_threads: 

Con este cambio, el código se ejecuta a través de 30 ciclos y se detiene con '¡todo listo!'. He agregado esto a mi lista de diferencias Python versus Idle de consola que deben documentarse.

+0

El mismo problema de threading.activeCount 'starting' por encima de 1 podría ocurrir cuando se ejecuta en cualquier otro entorno administrado o cuando un módulo no es el primero en importar threading. –

Cuestiones relacionadas