我在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()
问题的根本原因是什么?我如何解决它?
发布于 2019-06-19 05:12:15
这是由全局解释器锁引起的。线程共享程序内存。为了防止因单独的线程更改相同的变量而导致的冲突,Python将执行锁定到特定的线程。这意味着在任何时刻只有一个线程运行。当CPU空闲时,程序会在线程之间切换,从而使IO受限的应用程序运行得更快。相比之下,进程同时在独立的内核上运行,并且不共享内存。
当代码中的第二个线程启动时,两个线程都会尝试访问相同的变量。这会导致线程出错,而进程运行正常。
Here是一个很好的例子,而且解释也比较冗长。
https://stackoverflow.com/questions/56651537
复制相似问题