You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多进程下OpenCV摄像头与Requests Get请求并行执行异常求助

解决多进程中OpenCV与网络请求并行执行的问题

嘿,我一眼就看到你代码里的问题啦——这是多进程入门时非常容易踩的小坑!

问题根源

你在创建Process对象的时候犯了一个关键错误:

p1 = Process(target=func_run_forever())
p2 = Process(target=func_run_once())

这里的func_run_forever()和func_run_once()后面加了括号,会直接在主进程中调用这些函数,而不是把函数作为子进程的执行目标。这就导致你的摄像头窗口先在主进程里跑起来,直到你关闭窗口,主进程才会继续执行后面的代码,创建第二个进程去发网络请求——这就是为什么请求要等窗口关闭才执行的原因。

修正后的代码

只需要去掉函数名后面的括号,把函数对象传给target参数就行:

from multiprocessing import Process
import cv2
import requests

def func_run_forever():
    cap = cv2.VideoCapture(0)
    while(True):
        ret, frame = cap.read()
        cv2.imshow('frame',frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    cap.release()
    cv2.destroyAllWindows()

def func_run_once():
    res = requests.get('https://www.google.com.au')
    print(res)

if __name__ == '__main__':
    # 去掉函数后的括号,传入函数对象
    p1 = Process(target=func_run_forever)
    p2 = Process(target=func_run_once)
    p1.start()
    p2.start()
    p1.join()
    p2.join()

额外新手建议

  • 调试多进程时,可以在函数里加入print(os.getpid())(记得导入os模块),这样能看到每个函数在哪个进程里执行,直观确认多进程是否真的并行运行。
  • 对于涉及GUI的操作(比如OpenCV的imshow),在部分操作系统上可能需要确保子进程的GUI循环正常,不过你当前的代码修正后应该能直接正常工作。
  • 如果后续需要给子进程传递参数,可以用args参数,比如Process(target=your_func, args=(param1, param2)),注意参数要以元组形式传递。

内容的提问来源于stack exchange,提问作者malcolmturnballs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 22:52:56