鱼C论坛

 找回密码
 立即注册
查看: 2610|回复: 5

[已解决]开启多进程报错

[复制链接]
发表于 2020-10-27 15:58:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
python3.7
win10
1.读写txt的一个函数,当不写errors时,开启不开多进程,可以完美运行:代码如下
with open('FG_temp2.txt',encoding='gbk') as f:
2.开启多进程后,报错如下
'gbk' codec can't decode byte 0xc5 in position 186: illegal multibyte sequence
3.开多进程,读的时候写上errors=“ignore”,有数据丢失。


疑问,为啥不开多进程可以完美读取数据?
开了多进程后,就有解析不过去的?

有谁遇到过类似的问题吗?
最佳答案
2020-10-27 16:25:11
本帖最后由 hrp 于 2020-10-27 16:26 编辑

多线程多进程读写同一个文件对象时会有竞争问题,比如一个汉字两个字节,一个线程读取到了前一个字节,指针移动,另一个线程读取到了后一个字节,这两个线程分别以gbk去解码一个字节,解不出来的可能性非常大,就算碰巧解出来了,得到的也不是原先的汉字了。当然这都是猜测。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-10-27 16:23:34 | 显示全部楼层
if __name__ == '__main__':
    start=time.time()  # 开始时间
    pa = Process(target=txtjoin3,args=(path_fg_a, 'A', save_fg_a_excel, save_fg_a_pkl,))
pa.start()
pa.join()
单独运行上边没问题
在开启一个另外一个路径下的就报错:函数里有一个numpy.reshape()的函数
开启多线程后,有的时候两个都报错,有的时候一个报错。
说reshape不成功,应该是数据有丢失。
cannot reshape array of size 4094 into shape (86,44)
=====>>>>>>>>A Line FG 电子表格合并完毕...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-27 16:25:11 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
本帖最后由 hrp 于 2020-10-27 16:26 编辑

多线程多进程读写同一个文件对象时会有竞争问题,比如一个汉字两个字节,一个线程读取到了前一个字节,指针移动,另一个线程读取到了后一个字节,这两个线程分别以gbk去解码一个字节,解不出来的可能性非常大,就算碰巧解出来了,得到的也不是原先的汉字了。当然这都是猜测。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-27 16:31:53 | 显示全部楼层
如果是读写同一个文件的话应该优先考虑多线程而不是多进程
1 很多操作系统规定一个只能被一个进程写 还要考虑竞争资源乱序的问题
2 读写文件是io密集型而不是cpu密集型 (前者是大部分时间在io就是传输数据 后者大部分时间在cpu计算)
如果非要用多进程,应该看看锁 回调函数之类的东西

回到你的问题来
我猜测是因为多进程的乱序写入 导致gbk解码失败

补充
什么是编码 解码 编码格式
编码 编码是信息从一种形式或格式转换为另一种形式 基本就是字符串转二进制
解码 则是编码反过来
常见编码格式
ascii 学过c就知道 设定了256个字符到数字的映射
gbk 在ascii的基础上加上了简体中文和繁体中文
utf8 包括了各种语言
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-27 21:26:34 From FishC Mobile | 显示全部楼层
hrp 发表于 2020-10-27 16:25
多线程多进程读写同一个文件对象时会有竞争问题,比如一个汉字两个字节,一个线程读取到了前一个字节,指针 ...

明天我再试试,有结果,继续跟帖。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-29 11:26:18 | 显示全部楼层
是我在函数里边写的有bug了,我把读取的5个文件夹的数据都写到一个文档里,同时区写入的时候导致数据错乱,导致报错。
当不开启线程的时候,按照顺序执行没问题,开启线程的时候就报错了。

优化:
把每个文件夹的文件写到对应的文档里,就没有这个问题了。同时开启线程进行读写,速度加快了一半,还是挺爽的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-18 04:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表