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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 05:36:00