代码之家  ›  专栏  ›  技术社区  ›  Igor Serebryany

python迭代器和线程安全

  •  4
  • Igor Serebryany  · 技术社区  · 16 年前

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

    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 回复  |  直到 16 年前
        1
  •  4
  •   Tim Pietzcker    16 年前

    updateWidgets() 不会改变 self.widgets 在适当的位置(这可能是一个问题),但是用一个新的列表替换它。对旧版本的引用至少保留到 for 环入 workOnWidgets() 已经完成,所以这应该不是问题。

    简单来说,你所做的就是这样:

    >>> 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