【问题标题】:python iterators and thread-safetypython迭代器和线程安全
【发布时间】:2010-04-30 11:02:30
【问题描述】:

我有一个由两个函数操作的类。一个函数创建一个小部件列表并将其写入类中:

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

另一个函数以某种方式处理小部件:

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

这些函数中的每一个都在它自己的线程中运行。问题是,如果updateWidgets() 线程在workOnWidgets() 线程运行时执行会发生什么?

我假设作为for...in 循环的一部分创建的迭代器将保留对old self.widgets 对象的某种引用?所以我将完成对旧列表的迭代......但我很想知道。

【问题讨论】:

    标签: python multithreading iterator thread-safety atomic


    【解决方案1】:

    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
    

    【讨论】:

      猜你喜欢
      • 2018-04-07
      • 2019-08-20
      • 2017-04-15
      • 2014-12-12
      • 1970-01-01
      • 2012-11-07
      • 2014-03-18
      • 2011-04-15
      • 1970-01-01
      相关资源
      最近更新 更多