クラス内の他のメソッドがまだ使用している間に、クラスメンバーをPythonで更新する方法とは何ですか?クラスメンバーへの定期的な更新のスレッド
完全に更新されるまでメンバーの古いバージョンを使用して残りのクラスを処理し続け、更新が完了するとすべての処理を新しいバージョンに切り替えます。ここで
はself.numbers
は、私がrunCounter()
により、非ブロッキング方法で呼び出さたいupdateNumbers()
のロジックを使用して安全にスレッド定期的に更新し、必要とするクラスのメンバーである私のユースケースを、説明するためにおもちゃの一例です。
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いいえ、新しいバージョンに切り替える必要はありません。ループが終了するまで古いものを使用し続ける必要があります。 –