2010-04-30 91 views
4

我有一個正在被兩個函數操作的類。一個函數創建小部件列表並將其寫入到類:python迭代器和線程安全

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

以某種方式在小部件等功能的交易:

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

每個功能運行在它自己的線程。問題是,如果updateWidgets()線程在workOnWidgets()線程運行時執行,會發生什麼情況?

我假設作爲for...in循環的一部分創建的迭代器將保留對舊的 self.widgets對象的某種引用?所以我會完成舊列表的迭代......但我很想知道確切的事情。

回答

4

updateWidgets()不會改變self.widgets到位(這將是一個問題),而是用新的列表替換它。至少要保留舊的引用,直到workOnWidgets()中的for循環完成,所以這應該不成問題。

簡化,你在做什麼是一種像這樣:

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

但是,你會遇到了問題,如果你修改你遍歷列表:

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

很好的答案和很好的例子。謝謝! – 2010-04-30 22:09:43