2010-04-30 15 views
4

J'ai une classe qui est opérée par deux fonctions. Une fonction crée une liste de widgets et écrit dans la classe:itérateurs python et sécurité de thread

def updateWidgets(self): 
    widgets = self.generateWidgetList() 
    self.widgets = widgets 

les autres offres de fonction avec les widgets d'une certaine façon:

def workOnWidgets(self): 
    for widget in self.widgets: 
     self.workOnWidget(widget) 

chacune de ces fonctions s'exécute dans son propre fil. la question est, que se passe-t-il si le thread updateWidgets() s'exécute pendant que le thread workOnWidgets() est en cours d'exécution?

Je suppose que l'itérateur créé dans le cadre de la boucle for...in conservera une sorte de référence à l'objet ancien self.widgets? Je vais donc finir de parcourir l'ancienne liste ... mais j'aimerais bien le savoir.

Répondre

4

updateWidgets() ne modifie pas self.widgets en place (ce qui aurait été un problème) mais plutôt le remplace par une nouvelle liste. Les références à l'ancien sont conservées au moins jusqu'à ce que la boucle for en workOnWidgets() soit terminée, cela ne devrait donc pas poser de problème.

simplifié, ce que vous faites est un peu comme ceci:

>>> l=[1,2,3] 
>>> for i in l: 
... l=[] 
... print(i) 
... 
1 
2 
3 

Cependant, vous seriez en cours d'exécution des problèmes si vous avez modifié la liste que vous itérer sur:

>>> l=[1,2,3] 
>>> for i in l: 
... l[2]=0 
... print(i) 
... 
1 
2 
0 
+0

bonne réponse, et de bons exemples. Merci! –