python - OpenCV中的Python线程问题
问题描述
threading
我在OpenCV中使用模块,遇到了一个奇怪的问题。使用线程时,我无法再次启动相机以获取视频输入。我会拍一帧然后停下来。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()
问题的根本原因是什么,我该如何解决?
解决方案
这是由全局解释器锁引起的。线程共享程序内存。为了防止由不同线程更改相同变量引起的冲突,Python 将执行锁定到特定线程。这意味着在任何时候只有一个线程运行。当 CPU 空闲时,程序在线程之间切换,使 IO-bound 应用程序运行得更快。相比之下,进程在不同的内核上同时运行并且不共享内存。
当第二个线程在您的代码中启动时,两个线程都尝试访问相同的变量。这会导致线程出错,而进程运行良好。
这是优秀且更冗长的解释。
推荐阅读
- r - 将包和函数称为另一个函数中的参数
- c++ - 无法在几秒钟内将参数传递给 FFMpeg 淡入淡出音频过滤器
- javascript - URLSearchParams 中的等价数组格式
- typescript - 如何使用 lodash 合并对象数组
- gitlab-ci - 如何将 .gitlab-ci.yml 设置为仅在一个节点上运行任务,并且仅将 repo 更新或推送到其他节点(docker-swarm)?
- python - 如何使用 python usdz 命令行工具将形状键动画从 .glb 转换为 .usdz
- python - JSON到字符串到JSON Python
- c# - 等待 faceClient.Face.DetectWithStreamAsync 返回 null
- django - 如何在多个 django 模型上为 Sum() 应用注释?
- firebase - 如何在 Firebase 中设置规则,以便只有我的应用程序可以在我的数据库 firestore 上写入?