2010-04-30 58 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