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

树莓派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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 23:50:25