我有一个由两个函数操作的类.一个函数创建一个小部件列表并将其写入类中:
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对象的某种引用?所以我将完成旧列表的迭代……但我很想知道.
解决方法:
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
标签:python,iterator,atomic,multithreading,thread-safety
来源: https://codeday.me/bug/20190627/1300095.html