windows下DataLoader的num_workers设置引起卡死/堵塞/报错
原因:
- win环境启动线程是靠spwan(),而基于的Dataset基类定义的数据集,getitem()的过程会和脚本原来进程冲突等等。冲突会造成报错,然而你的自定义Dataset里调用了getitem()如opencv,numpy等包的话会发生卡死。
解决办法一:
把num_workers设置成0。
解决方法二、
if name == 'main’
不同平台的区别,在 windows平台,python是使用spawn方式创建子进程,即导入当前的脚本作为module运行。在linux平台,则是以fork的方式创建子进程,父进程会拷贝当前的进程信息给子进程,子进程和父进程在异步继续执行。这两种方式的不同,会导致我们在写代码时需要注意一些细节,对于spawn方式,由于子进程是重新导入一份脚本,所以创建子进程之前的代码也有可能被子进程执行,导致子进程又创建子进程,会出错。我们需要加入if name == 'main’来规避这种意外,即将只希望主进程执行的代码放在条件判断后,因为是导入模块,子进程并不会执行条件判断后的代码。而fork方式则不会产生这种情况,子进程会继续沿着主进程的进度往下执行。
网友评论