Python迭代器与线程安全

4 投票
1 回答
1238 浏览
提问于 2025-04-15 22:12

我有一个类,这个类被两个函数操作。一个函数负责创建一个小部件的列表,并把它写入这个类:

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

撰写回答