首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >OpenCV中的Python线程问题

OpenCV中的Python线程问题
EN

Stack Overflow用户
提问于 2019-06-18 22:34:31
回答 1查看 1.4K关注 0票数 1

我在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()

问题的根本原因是什么?我如何解决它?

EN

回答 1

Stack Overflow用户

发布于 2019-06-19 05:12:15

这是由全局解释器锁引起的。线程共享程序内存。为了防止因单独的线程更改相同的变量而导致的冲突,Python将执行锁定到特定的线程。这意味着在任何时刻只有一个线程运行。当CPU空闲时,程序会在线程之间切换,从而使IO受限的应用程序运行得更快。相比之下,进程同时在独立的内核上运行,并且不共享内存。

当代码中的第二个线程启动时,两个线程都会尝试访问相同的变量。这会导致线程出错,而进程运行正常。

Here是一个很好的例子,而且解释也比较冗长。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56651537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档