Python多进程调用时for循环重复执行问题求助
问题原因分析
- Python在Windows/macOS系统中,multiprocessing默认使用spawn模式创建子进程。这种模式下,子进程会重新导入整个主脚本文件。
- 你的for循环、进程创建代码都写在模块顶层(未被
if __name__ == '__main__':包裹),导致每个子进程启动时都会重复执行这些代码,出现循环多次运行的情况。 - 对应你的现象:
- 初始代码中,主进程执行一次循环并启动1个子进程,子进程导入脚本时又跑一遍循环(但不启动进程),所以循环总共执行2次。
- 添加p101、p102后,主进程启动3个子进程(原摄像头进程+2个新进程),加上主进程自身,循环总共执行4次。
- 移除进程代码后没有子进程创建,自然只执行1次循环。
解决办法
把所有主进程专属的逻辑(循环、进程创建与启动)全部放到if __name__ == '__main__':代码块内,子进程导入脚本时不会执行该块内的代码,彻底避免重复执行。
修改后的代码示例:
# 保留你的函数定义、innstillinger、queue等全局变量(如果有的话) if __name__ == '__main__': # 原for循环逻辑移至此处 for x in range(1, 100): try: temp_kamera = 'port_kamera' + str(x) temp_kamera_attr = getattr(innstillinger, temp_kamera) print(x) print(temp_kamera) print(temp_kamera_attr) except: continue try: if isinstance(temp_kamera_attr, str): temp_retning = 'kjoreretning_kamera' + str(x) print(temp_retning) temp_retning = getattr(innstillinger, temp_retning) print(temp_retning) temp_prosess = 'p' + str(x) print(temp_prosess) temp_beskrivelse = 'Last inn data, fra kamera' + str(x) print(temp_beskrivelse) temp_prosess = Process(target=lastinndata, args=(queue, int(temp_kamera_attr), temp_retning), daemon=False, name=temp_beskrivelse) print(temp_prosess) temp_prosess.start() except: continue # p101、p102的逻辑移至此处 p101 = Process(target=enkeltoppslag, args=(queue,), daemon=False, name='Enkeltoppslag og lagring til database.') p102 = Process(target=sletting, args=(), daemon=False, name='Sletting av reg. nr for eldre oppføringer.') p101.start() p102.start() # 注意:摄像头进程是无限循环,无需join;p101/p102如果是后台任务,也可根据需求决定是否join # p101.join() # p102.join()
额外注意事项
- 不要在
if __name__ == '__main__':块外定义主进程专属逻辑,避免子进程重复执行。 - 即使是Unix/Linux系统(默认fork模式无此问题),用主入口块包裹代码也能提升跨平台兼容性。
内容的提问来源于stack exchange,提问作者M A
相关产品推荐
相关产品推荐

