全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 python论坛
1289 1
2023-04-15
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:原因:在机器学习中模型路径不同。比如训练好的模型拷贝到其他路径下,再加载时会出现改问题。解决方法:在需要的路径下再训练一份。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2023-4-22 11:51:44
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群