树莓派3A上Multiprocess进程无法终止问题求助
解决树莓派Thonny中多进程脚本停止后子进程残留问题
问题根源
在Thonny中停止脚本时,主进程被终止,但子进程作为独立进程不会自动退出,加上cv2的播放循环没有退出条件,导致窗口无法关闭。另外你的代码里args写法有误:([resizer(img,70)])会把列表作为单个参数传递,正确格式应为元组(resizer(img,70),)(注意末尾逗号)。
解决方案
1. 捕获中断信号,主动终止子进程
修改主进程代码,捕获KeyboardInterrupt异常,退出前手动终止子进程:
from multiprocessing import Process import cv2 def resizer(img, scale): # 你的图片缩放逻辑 pass def video_player(img_list): while True: for img in img_list: cv2.imshow('Player', img) # 添加按键检测,支持手动退出 if cv2.waitKey(30) & 0xFF == ord('q'): cv2.destroyAllWindows() return cv2.destroyAllWindows() if __name__ == '__main__': # 修正args为元组格式 p = Process(target=video_player, args=(resizer(img,70),)) try: p.start() p.join() # 等待子进程结束 except KeyboardInterrupt: p.terminate() # 终止子进程 p.join() # 确保子进程完全退出 cv2.destroyAllWindows()
2. 设置子进程为守护进程
将子进程设为守护进程,主进程退出时子进程会自动终止:
if __name__ == '__main__': p = Process(target=video_player, args=(resizer(img,70),), daemon=True) p.start() p.join()
注意:守护进程无法创建子进程,主进程退出时会直接终止它,适合简单播放场景。
3. 在video_player中添加强制退出条件
给播放函数添加可响应的退出信号,比如用事件对象:
from multiprocessing import Process, Event def video_player(img_list, stop_event): while not stop_event.is_set(): for img in img_list: if stop_event.is_set(): break cv2.imshow('Player', img) if cv2.waitKey(30) & 0xFF == ord('q'): stop_event.set() break cv2.destroyAllWindows() if __name__ == '__main__': stop_event = Event() p = Process(target=video_player, args=(resizer(img,70), stop_event)) try: p.start() p.join() except KeyboardInterrupt: stop_event.set() p.terminate() p.join() cv2.destroyAllWindows()
应急方法:手动杀死残留进程
不用重启树莓派,在终端执行命令清理残留进程:
# 查找相关Python进程 ps aux | grep python # 杀死对应进程,替换[PID]为实际进程ID kill -9 [PID]
内容的提问来源于stack exchange,提问作者user20431
相关产品推荐
相关产品推荐

