Мне просто нужно было это, так что я написал это .. Собираюсь попробовать это сейчас, так что не уверен, работает ли он еще как ожидалось ..
class LockedNumpyArray(object):
"""
Thread safe numpy array
"""
def __init__(self):
self.lock = threading.Lock()
self.val = None
def __get__(self, obj, objtype):
self.lock.acquire()
if self.val != None:
ret_val = self.val.copy()
else:
ret_val = None
self.lock.release()
# print('getting', ret_val)
return ret_val
def __set__(self, obj, val):
self.lock.acquire()
# print('setting', val)
self.val = val.copy()
self.lock.release()
Это класс для массива numpy.Затем у меня есть класс для управления, потому что позже я хочу, чтобы работали более многопоточные массивы.
class CaptureControl():
"""
Shared class to control source capture execution
"""
frame = LockedNumpyArray()
def __init__(self):
print(self.frame)
self.frame = np.array([2])
print(self.frame)
В конце я поместил экземпляр этого класса CaptureControl в потоки следующим образом.
class CaptureThread(threading.Thread):
"""
Thread running source capturing
"""
def __init__(self, capture_control):
threading.Thread.__init__(self)
self.capture_control = capture_control
self.sleepTime = 0.01
def run(self):
while True:
self.capture_control.capture_frame()
time.sleep(self.sleepTime)
if __name__ == '__main__':
capture_control = CaptureControl()
capture_thread = CaptureThread(capture_control)
capture_thread.start()
Я буду рад, если кто-нибудь поделится своими мыслями об этом решении, не считая time.sleep в функции запуска потока, поскольку это только пример;).