Сценарий ниже является абстрактным.Мой вопрос касается использования threading.Lock()
Блокировка ограничивает доступ к «общим ресурсам», но я волнуюсь по поводу того, как далеко это заходит.У меня есть атрибуты объектов, которые являются списками объектов, которые имеют атрибуты, которые являются массивами в этом примере.В некоторых случаях зависимость пойдет дальше.
Знает ли Lock()
наверняка обо всем, что должно быть заблокировано?
Вывод сценария ниже также показан.Цель сценария в основном для обсуждения - он не ошибается, но я не уверен, что он блокирует все, что ему нужно.
start: [array([0, 1]), array([0, 1, 2]), array([0, 1, 2, 3])]
append an object
done!
finish: [array([505, 605]), array([10, 11, 12]), array([10, 11, 12, 13]), array([5])]
import time
from threading import Thread, Lock
import numpy as np
class Bucket(object):
def __init__(self, objects):
self.objects = objects
class Object(object):
def __init__(self, array):
self.array = array
class A(Thread):
def __init__(self, bucket):
Thread.__init__(self)
self.bucket = bucket
def run(self):
nloop = 0
locker = Lock()
n = 0
while n < 10:
with locker:
objects = self.bucket.objects[:] # makes a local copy of list each time
for i, obj in enumerate(objects):
with locker:
obj.array += 1
time.sleep(0.2)
n += 1
print 'n: ', n
print "done!"
return
objects = []
for i in range(3):
ob = Object(np.arange(i+2))
objects.append(ob)
bucket = Bucket(objects)
locker = Lock()
a = A(bucket)
print [o.array for o in bucket.objects]
a.start()
time.sleep(3)
with locker:
bucket.objects.append(Object(np.arange(1))) # abuse the bucket!
print 'append an object'
time.sleep(5)
print [o.array for o in bucket.objects]