首页 > 其他分享 >踩坑日志2:dataloader的num_workers问题

踩坑日志2:dataloader的num_workers问题

时间:2024-09-15 12:13:41浏览次数:10  
标签:__ name workers dataloader num 进程 main 代码

当我想用dataloader多开子进程加快图片加载速度时,发现报有关进程的错误:

RuntimeError: 
        An attempt has been made to start a new process before the
        current process has finished its bootstrapping phase.

        This probably means that you are not using fork to start your
        child processes and you have forgotten to use the proper idiom
        in the main module:

            if __name__ == '__main__':
                freeze_support()
                ...

        The "freeze_support()" line can be omitted if the program
        is not going to be frozen to produce an executable.

        To fix this issue, refer to the "Safe importing of main module"
        section in https://docs.python.org/3/library/multiprocessing.html

原因:我使用的系统是Windows,与Linux系统在子进程底层操作上还有些不同。Windows是将脚本里所有东西都重新执行一次,所必需将与创建子进程的相关代码放在if __name__ == '__main__'中。

此外仅仅将部分代码放在if __name__ == '__main__'还不够,发现:如果__name__外面还有其他非定义类、非定义函数的代码,则有多少个num_workers就会重复执行多少次代码。其原因也是因为Windows创建进程的方式是重新运行主脚本。

 总结:如果要使用多进程,必须将创建多进程的代码放在if __name__ == '__main__'的保护之下,此外为了防止重复执行主脚本的代码,必须将主脚本中除定义类、函数以外的代码也放进去。

 

标签:__,name,workers,dataloader,num,进程,main,代码
From: https://www.cnblogs.com/joker-yyak/p/18415133

相关文章

  • 2024-09-14:用go语言,给定一个正整数数组 nums,定义一个加密函数 encrypt(x),其将一个整数
    2024-09-14:用go语言,给定一个正整数数组nums,定义一个加密函数encrypt(x),其将一个整数x的每一位数字都替换为x中的最大数字,然后返回加密后的数字。例如,encrypt(523)会返回555,encrypt(213)会返回333。现在需要计算数组中所有元素加密后的和,然后返回这个和。输入:nums=[10,2......
  • EnumInfo
    packagecom.shrimpking.t5;/***CreatedbyIntelliJIDEA.**@Author:Shrimpking*@create2024/9/1216:09*/publicenumWeek{Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday;}packagecom.shrimpking.t5;/***CreatedbyInt......
  • 为什么在EffectiveJava中建议用EnumSet替代位字段,以及使用EnumMap替换序数索引
    在EffectiveJava中的第36条中建议用EnumSet替代位字段,在第37条中建议用EnumMap替换序数索引,为什么?EnumSet在EffectiveJava中的第36条中建议用EnumSet替代位字段36、用EnumSet替代位字段如果枚举类型的元素主要在Set中使用,传统上使用int枚举模式,通过不同的2的平......
  • 为什么在EffectiveJava中建议用EnumSet替代位字段,以及使用EnumMap替换序数索引
    在EffectiveJava中的第36条中建议用EnumSet替代位字段,在第37条中建议用EnumMap替换序数索引,为什么?EnumSet在EffectiveJava中的第36条中建议用EnumSet替代位字段36、用EnumSet替代位字段如果枚举类型的元素主要在Set中使用,传统上使用int枚举模式,通过不同的......
  • 为什么在EffectiveJava中建议用EnumSet替代位字段,以及使用EnumMap替换序数索引
    在EffectiveJava中的第36条中建议用EnumSet替代位字段,在第37条中建议用EnumMap替换序数索引,为什么?EnumSet在EffectiveJava中的第36条中建议用EnumSet替代位字段36、用EnumSet替代位字段如果枚举类型的元素主要在Set中使用,传统上使用int枚举模式,通过不同的2的......
  • 2024-09-11:用go语言,给定一个从0开始的整数数组nums和一个正奇数整数k, 要求在nums数组
    2024-09-11:用go语言,给定一个从0开始的整数数组nums和一个正奇数整数k,要求在nums数组中选择k个不重叠的子数组,使得这些子数组的能量值之和最大。子数组的能量值是通过一定规则计算得到的,具体规则是对于某个子数组,将其每个元素乘以一个特定系数,并将这些结果相加,系数随着元素在子数组......
  • PLC结构化文本(ST)——隐式枚举(implicit enum)
    PLCStructuredTextObjectOrientedProgrammingPLC结构化文本(ST)——隐式枚举(implicitenum)什么是隐式枚类型在POU内部声明的枚举类型称为implicitenum。如何创建隐式枚举类型PROGRAMMAINVAR state:(IDLE,SEND_REQUEST,WAIT_FOR_RESPONSE,READ_RESPONSE,ERROR);EN......
  • 【C#】LINQ操作实现 IEnumerable<T> 接口的集合
    IEnumerable<TSource> 接口详解IEnumerable<TSource> IEnumerable<TSource>是C#中的一个泛型接口,它定义了如何遍历一组对象。这个接口是.NETFramework中LINQ(LanguageIntegratedQuery)的基础之一,用于提供一种统一的方式来访问不同类型的集合。IEnumerable<TSource>......
  • Python Numpy布尔数组在数据分析中的应用
    大家好,在数据分析和科学计算中,布尔数组是一个非常重要的工具,它可以帮助我们进行数据的筛选、过滤和条件判断。Python的Numpy库提供了丰富的布尔运算功能,能够高效地对数据进行处理。本文将深入探讨Numpy中的布尔数组,介绍布尔运算和布尔索引的使用方法,并通过具体的示例代码展示其......
  • Oracle rownum用法
    ownum是oracle特有的一个关键字。对于基表,在insert记录时,oracle就按照insert的顺序,将rownum分配给每一行记录,因此在select一个基表的时候,rownum的排序是根据insert记录的顺序显示的。例如:selectrownumrn,t.*fromempt;对于子查询,则rownum的顺序是根据子查询的查询顺序进行......