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 对象的某种引用?所以我会完成对旧列表的迭代……但我想确认一下这个想法。
1 个回答
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