楼主: htseng
1235 1

【转】一个实用的Python多进程相关问题解决 [推广有奖]

  • 0关注
  • 0粉丝

博士生

0%

还不是VIP/贵宾

-

威望
0
论坛币
456 个
通用积分
37.3223
学术水平
0 点
热心指数
1 点
信用等级
0 点
经验
8029 点
帖子
129
精华
0
在线时间
80 小时
注册时间
2008-3-1
最后登录
2025-12-9

楼主
htseng 发表于 2023-4-15 16:15:48 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
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:原因:在机器学习中模型路径不同。比如训练好的模型拷贝到其他路径下,再加载时会出现改问题。解决方法:在需要的路径下再训练一份。
二维码

扫码加我 拉你入群

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

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

关键词:python 问题解决 attribute tribute Windows

沙发
hifinecon 发表于 2023-4-22 11:51:44

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-9 15:38