gpt4 book ai didi

python - 在多线程中使用锁

转载 作者:太空宇宙 更新时间:2023-11-03 22:43:59 25 4
gpt4 key购买 nike

我正在尝试使用多 (3) 线程并按下按钮同时保存来自三个摄像头的图像。

我选了一个code online并创建了三个对象实例。线程运行良好,窗口显示并可以保存图像。但我不确定我是否在正确的意义上使用“锁”(获取和释放)。总共有 4 把锁。

Current Code:
#!/usr/bin/env python

from threading import Thread, Lock
import cv2

class WebcamVideoStream :
def __init__(self, src = 0, width = 1024, height = 768) :
# width = 320, height = 240
self.stream = cv2.VideoCapture(src)
self.stream.set(cv2.CAP_PROP_FRAME_WIDTH, width)
self.stream.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
(self.grabbed, self.frame) = self.stream.read()
self.started = False
self.read_lock = Lock()

def start(self) :
if self.started :
print "already started!!"
return None
self.started = True
self.thread = Thread(target=self.update, args=())
self.thread.start()
return self

def update(self) :
while self.started :
#if self.stream.grab():
#(grabbed, frame) = self.stream.retrieve()
(grabbed, frame) = self.stream.read()
self.read_lock.acquire()
self.grabbed, self.frame = grabbed, frame
self.read_lock.release()

def read(self) :
self.read_lock.acquire()
frame = self.frame.copy()
self.read_lock.release()
return frame

def stop(self) :
self.started = False
self.thread.join()

def __exit__(self, exc_type, exc_value, traceback) :
self.stream.release()

if __name__ == "__main__" :
mainer_lock = Lock()
vs = WebcamVideoStream(src = 0).start()
vs2 = WebcamVideoStream(src = 1).start()
vs3 = WebcamVideoStream(src = 2).start()

while True :
frame = vs.read()
frame2 = vs2.read()
frame3 = vs3.read()
cv2.imshow('webcam', frame)
cv2.imshow('webcam2', frame2)
cv2.imshow('webcam3', frame3)

if cv2.waitKey(1) == 99:
mainer_lock.acquire()
cv2.imwrite('cam_pics/frame.jpg', frame)
cv2.imwrite('cam_pics/frame2.jpg', frame2)
cv2.imwrite('cam_pics/frame3.jpg', frame3)
mainer_lock.release()

vs.stop()
vs2.stop()
vs3.stop()
cv2.destroyAllWindows()

最佳答案

我认为你根本不需要锁。

首先,mainer_lock是没有意义的。我知道您想使用它来保护 frame[2, 3] 不被 vs[2, 3] 更改。但这是不可能的,因为主线程中的 frame[2, 3] 是原始帧的副本(我想你正在正确使用 copy )。 vs[2, 3] 只会改变它们实例中的框架,不会影响主线程中的框架。

其次,read_lock也是没有意义的。你真的介意在阅读时改变框架吗?当您捕获真实帧时,结果帧几乎相同。因此,假设您想要以 1000 毫秒的速度捕获帧,但是哦,由于线程竞争,您实际上以 1002 毫秒的速度捕获帧。但这真的重要吗?据我认为,事实并非如此。

关于python - 在多线程中使用锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50502530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com