Ho un dizionario aggiornato da un thread e in un altro thread vorrei ripetere i suoi valori. Normalmente userei un lucchetto, ma questo codice è molto critico per le prestazioni, e voglio evitarlo se possibile.Si può iterare un dizionario modificato da un altro thread senza generare eccezioni?
Una particolarità del mio caso è che non mi interessa la correttezza assoluta dell'iteratore; se manca le voci che sono state rimosse dopo l'avvio dell'iterazione, o raccoglie quelle aggiunte in seguito, va bene. Richiedo solo che non generi alcun tipo di eccezione "dimensione dizionario modificata durante l'iterazione".
Dato questo vincolo rilassato sulla correttezza, esiste un modo efficace per iterare il dizionario senza utilizzare un blocco?
Nota: sono a conoscenza del fatto che keys()
è thread-safe in Python 2.x, ma poiché tale comportamento è stato modificato in 3.x, voglio evitarlo.
Cosa succede se si 'basta farlo'? –
Quando parliamo di concorrenza, preferirei lavorare sui fatti piuttosto che sugli esperimenti casuali. – DNS
Tenendo presente gli effetti del Global Interpreter Lock, avere un blocco attorno al tuo dict potrebbe non essere costoso come pensi (dato che i tuoi due thread non verranno eseguiti contemporaneamente). – NPE