我在OpenCV中使用threading
模块,遇到了一个奇怪的问题。使用线程时,我无法再次启动相机以进行视频输入。我会拍一帧然后停下来。当使用multiprocessing
模块时,这样没有问题。我不明白是什么原因导致了这种奇怪的行为。
此代码总结了我遇到的问题,该程序将在第二次创建线程时卡住。
import cv2
import time
import threading
def open_cam():
count = 0
cam = cv2.VideoCapture(0)
while True:
ret_val, img = cam.read()
print(ret_val)
cv2.imshow("Image", img)
count += 1
if count == 100:
break
if (cv2.waitKey(1) & 0xFF) == ord('q'):
break
cv2.destroyAllWindows()
def start_thread():
print("CREATING THREAD")
cam_thread = threading.Thread(target=open_cam)
print("STARTING THREAD")
cam_thread.start()
start_thread()
time.sleep(5)
start_thread()
但是,此代码完全符合我的期望,它使用multiprocessing
模块而不是threading
import cv2
import time
import multiprocessing
def open_cam():
count = 0
cam = cv2.VideoCapture(0)
while True:
ret_val, img = cam.read()
print(ret_val)
cv2.imshow("Image", img)
count += 1
if count == 100:
break
if (cv2.waitKey(1) & 0xFF) == ord('q'):
break
cv2.destroyAllWindows()
def start_process():
print("CREATING process")
cam_process = multiprocessing.Process(target=open_cam)
print("STARTING process")
cam_process.start()
start_process()
time.sleep(5)
start_process()
问题的根本原因是什么,如何解决?
答案 0 :(得分:0)
这是由全局解释器锁定引起的。线程共享程序内存。为了防止由单独的线程更改相同的变量引起的冲突,Python将执行锁定到特定的线程。这意味着在任何时候都只有一个线程在运行。当CPU空闲时,程序在线程之间切换,从而使IO绑定的应用程序运行得更快。相比之下,进程在不同的内核上同时运行,并且不共享内存。
当第二个线程在您的代码中启动时,两个线程都尝试访问相同的变量。这会导致线程错误,而进程运行正常。
Here是很好的解释,而且冗长。