2015-03-27 18 views
5

Ho incontrato errore 'RuntimeError: dizionario cambiato dimensione durante l'iterazione' mentre l'iterazione attraverso un dizionario in un thread, che viene inserito in un altro thread in Python 2.7 .ho trovato che utilizzando Globale Intrepreter Lock, potremmo bloccare un oggetto in situazione mutitizzata.Come potrei usare GIL per un dizionario in un'applicazione multithread?

 In thread1: 
      dictDemo[callid]=val 
     in thread2: 
      for key in dictDemo: 
        if key in dictDemo: 
          dictDemo.pop(key,None) 

ho incontrato l'errore 'RuntimeError: dizionario cambiato dimensione durante l'iterazione'.? in Thread2 dal Thread1 funziona allo stesso tempo ** Come posso usare GIL per bloccare il dizionario dictDemo in Thread2 ** Oppure GIL può essere utilizzato solo per i thread o esiste un modo per bloccare il dizionario in modo da limitare l'utilizzo dell'oggetto da 2 thread alla volta?

+1

è possibile utilizzare threading.Lock Object. – SolaWing

risposta

3

L'utilizzo di GIL per proteggere il codice Python non è sicuro: è difficile sapere quando si perde il GIL. Il GIL è lì per proteggere l'interprete, non il tuo codice.

È necessario serializzare l'uso del dizionario e il modo più semplice è utilizzare un oggetto Blocca.

from threading import Lock 
dLock = Lock() 

In Thread1:

dLock.acquire() 
dictDemo[callid]=val 
dLock.release() 

in Thread2:

dLock.acquire() 
for key in dictDemo.keys(): 
    #if key in dictDemo: <-- not required! 
    dictDemo.pop(key,None) 
dLock.release() 

A proposito, dictDemo.clear() potrebbe essere utile qui se tutto quello che vogliamo fare è quello di cancellare il dizionario.

+0

Ha funzionato ... Grazie per il tuo suggerimento .. –