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
相关产品推荐
相关产品推荐

