Что такое метод обновления члена класса в Python, пока он все еще используется другими методами в классе?Threading of Periodic Update to Class Member
Я хочу, чтобы остальная часть класса продолжала обработку с использованием старой версии этого элемента, пока он не будет полностью обновлен, а затем после завершения обновления переключите всю обработку на новую версию.
Вот игрушка пример, чтобы проиллюстрировать мой случай использования, где self.numbers
является членом класса, который нуждается в безопасном резьбовой периодическое обновление с помощью логики в updateNumbers()
, которую я хочу назвать в неблокируемом способе по runCounter()
.
from time import sleep, time
class SimpleUpdater(object):
def __init__(self):
self.i = 5
self.numbers = list(range(self.i))
self.lastUpdate = time()
self.updateDelta = 10
def timePast(self):
now = time()
delta = self.lastUpdate - now
return (delta > self.updateDelta)
def updateNumbers(self):
print('Starting Update', flush=True)
self.numbers = list(range(self.i))
# artificial calculation time
sleep(2)
print('Done Updating', flush=True)
def runCounter(self):
for j in self.numbers:
print(j, flush=True)
sleep(0.5)
self.i += 1
if self.timePast:
## Spin off this calculation!! (and safely transfer the new value)
self.updateNumbers()
if __name__ == '__main__':
S = SimpleUpdater()
while True:
S.runCounter()
Желаемого поведение является то, что если self.numbers
будет итерируемый на в петле, он должен закончить цикл со старой версией перед переходом на новую версию.
Это похоже на то, что вам, вероятно, нужно переосмыслить свой дизайн. В любом случае вы не сказали нам достаточно информации для нас, чтобы определить, что здесь представляет собой «безопасное» поведение. Например, если поток зацикливается на 'self.numbers', а другой поток обновляет' self.numbers' в середине цикла, должен ли цикл переключиться на цикл по новой версии? – user2357112
@ user2357112 Нет, ему не нужно переключаться на новую версию. Он должен продолжать использовать старый, пока цикл не будет завершен. –