Python итераторы и потокобезопасность - PullRequest
4 голосов
/ 30 апреля 2010

У меня есть класс, который управляется двумя функциями. Одна функция создает список виджетов и записывает его в класс:

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 голосов
/ 30 апреля 2010

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