https://zhuanlan.zhihu.com/p/555481500
Windows的进程启动方式是Spawn,Linux的缺省的启动方式是Fork。简单的说,Fork会复制父进程的所用东西,而Spawn不会。对于Python而言,Spawn会在进程中生成一个新的Python解释器,并重新加载各个module.子进程需要先把整体脚本当module import(也就是要运行的py脚本文件),除了这个脚本文件外,还会导入全局python环境下的模块包。
一、无法pickle对象导致的错误
1、无法正确pickle 。这个问题不会报错但会导致异常,非常隐蔽和难以排查。例如部分树模型,Pickle只能序列化子节点无法序列化叶子节点,导致查询出现空值。
2、无法pickle相应对象。无法pickle的对象不能在参数中传递和使用,但是可以作为中间过程。
例如a是一个生成器,在函数参数中传递和函数体中使用均会报错,但是作为中间过程不会
如b=a是会报错的,但是b=list(a)可以正常运行。
AttributeError: Can't get attribute 'disN' on <module '__main__' (built-in)>
1、原因:重复调用进程。解决:多进程工作写在 if __name__ =='__main__': 下面。
2:原因:由于windows多进程Pool不能fork,导致对于闭包、全局变量修改等场景不能序列化 pickle。不能使用未在导入的模块中定义的对象。解决方法:将函数写入不同的文件模块并导入该模块。
3:原因:在机器学习中模型路径不同。比如训练好的模型拷贝到其他路径下,再加载时会出现改问题。解决方法:在需要的路径下再训练一份。


雷达卡




京公网安备 11010802022788号







