2010-06-30 14 views
5

Sembra che IDLE (parte dell'installazione standard di Python per Windows) non esegua correttamente i programmi con multithreading senza problemi di blocco o di arresto anomalo. Qualcuno sa di un modo per risolvere questo problema?Python IDLE compatibile con multithreading?

Il seguente programma sempre bloccherà in IDLE ma completa normalmente quando eseguito con l'interprete direttamente: uscita

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!" 

campione:

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! 

uscita quando utilizza IDLE "Run Module" funzione sempre si blocca indefinitamente intorno al tempo in cui la linea che legge 23 o 24 viene visualizzata sulla mia macchina.

risposta

2

AFAIK è un crapshoot quando si esegue il codice con thread in IDLE. IDLE usa il GIL liberamente, quindi le condizioni di gara e i deadlock sono comuni. Sfortunatamente, non sono abbastanza esperto nel threading per offrire informazioni su come rendere questo thread-safe, oltre l'ovvio.

+2

IDLE è scritto in Tkinter, non in WxPython. –

+0

Idle è scritto in codice Python e Python non utilizza direttamente GIL. AFAIK, l'uso di Idle del modulo di threading è limitato alle classi Threading e Condition e alla funzione current_thread. –

1

IDLE ha alcuni problemi noti quando si tratta di threading. Non conosco una quantità schiacciante dei dettagli di perché il numero è un problema, perché mi sforzo molto duramente di stare lontano da IDLE, ma so che lo è. Vi suggerisco caldamente di andare a prendere IronPython e Python Tools per Visual Studio. Gli strumenti di debug di VS sono assolutamente ineguagliabili, soprattutto data l'enorme libreria di componenti aggiuntivi.

1
import threading 
print(threading.activeCount()) 

stampa 1 quando viene eseguito sulla riga di comando, 2 quando viene eseguito da Idle. Quindi il tuo ciclo

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

terminerà nella console ma continuerà all'infinito in Idle.

per risolvere il problema nel codice scritto, aggiungere qualcosa di simile

initial_threads = threading.activeCount() 

dopo l'importazione e modificare l'intestazione ciclo per

while threading.activeCount() > initial_threads: 

Con questa modifica, il codice viene eseguito attraverso 30 cicli e si ferma con 'tutto fatto!'. Ho aggiunto questo al mio elenco di console Python rispetto alle differenze di inattività che devono essere documentate.

+0

Lo stesso problema di threading.activeCount 'starting' sopra 1 potrebbe verificarsi quando è in esecuzione in qualsiasi altro ambiente gestito o quando un modulo non è il primo ad importare il threading. –