多进程下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
相关产品推荐
相关产品推荐

