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

Python多进程串口读写与视频录制同步异常排查求助

问题排查与解决方案

我一眼就看出问题出在if __name__ == '__main__':的位置上——你把这个关键的入口判断放到主循环的分支里面了,这完全不符合Python multiprocessing模块的工作逻辑!

核心原因分析

在Windows系统下(这是这类问题最常见的场景),multiprocessing创建子进程时会重新导入主模块。如果你的主模块顶层有直接执行的代码(比如那个while True循环),子进程启动时会直接执行这段代码,陷入无限循环,根本无法去运行你指定的Record_Video或my_write_file目标函数。

而你把if __name__ == '__main__':嵌套在if s1 == 'Receding'分支里,会导致两个致命问题:

  • 主进程虽然能进入这个分支,但子进程导入主模块时,__name__不是__main__,但主模块的while True循环会直接跑起来,子进程完全偏离了预期任务。
  • 这种写法破坏了multiprocessing的启动规范,引发不可预测的进程行为,比如你看到的“代码打印了Hello1/2,但进程完全没启动”。

测试脚本能正常运行,是因为它把if __name__ == '__main__':放在了顶层,循环逻辑也在这个块内部——子进程导入时不会执行这个块里的代码,只会加载函数定义,所以能正常启动子进程。

修复后的核心代码

你需要把所有主程序逻辑(包括while循环)都放到顶层的if __name__ == '__main__':块里,同时移除分支内部的多余判断:

if __name__ == '__main__':
    while True:
        jj = get_data(n_readings)
        My_radar_data = radar_data(jj, n_readings , confidence)
        s1, s2, s3 = My_radar_data.get_direction()
        print('Direction = ', s1,',' , 'C_a = ',str(s2)[:4],',','C_r',str(s3)[:4])
        print('\n')
        time_stamp = datetime.now().strftime("%y-%m-%d-%H-%M-%S.%f")[:-3]
        if s1 == 'Receding':
            print("Hello 1")
            print("Hello 2")
            # 直接创建并启动进程,不需要嵌套__main__判断
            P1 = Process(target=Record_Video, args=(video_length, time_stamp,))
            P2 = Process(target=my_write_file, args=(time_stamp,))
            P1.start()
            P2.start()
            P1.join()
            P2.join()  # 阻塞直到进程终止

额外注意事项

  • 确保函数定义在__main__块外:Record_Video、my_write_file以及file_trial类都要定义在if __name__ == '__main__':块的外面,这样子进程才能正常导入并执行它们。
  • 避免子进程中的GUI操作:cv2.imshow在子进程中可能会出现窗口无响应或者报错的情况,如果不需要实时预览视频,可以去掉cv2.imshow('frame',frame)和cv2.waitKey(1)的相关代码,只保留视频写入逻辑。
  • 进程资源清理:虽然你在Record_Video里做了资源释放,但如果进程意外终止,可能还是会有摄像头占用的问题,可以考虑添加异常捕获来确保资源被正确释放。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:35:48