rsj0315 发表于 2020-10-27 15:58:17

开启多进程报错

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”,有数据丢失。


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

有谁遇到过类似的问题吗?

rsj0315 发表于 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 电子表格合并完毕...

hrp 发表于 2020-10-27 16:25:11

本帖最后由 hrp 于 2020-10-27 16:26 编辑

多线程多进程读写同一个文件对象时会有竞争问题,比如一个汉字两个字节,一个线程读取到了前一个字节,指针移动,另一个线程读取到了后一个字节,这两个线程分别以gbk去解码一个字节,解不出来的可能性非常大,就算碰巧解出来了,得到的也不是原先的汉字了。当然这都是猜测。

mrcrisis 发表于 2020-10-27 16:31:53

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

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

补充
什么是编码 解码 编码格式
编码 编码是信息从一种形式或格式转换为另一种形式 基本就是字符串转二进制
解码 则是编码反过来
常见编码格式
ascii 学过c就知道 设定了256个字符到数字的映射
gbk 在ascii的基础上加上了简体中文和繁体中文
utf8 包括了各种语言

rsj0315 发表于 2020-10-27 21:26:34

hrp 发表于 2020-10-27 16:25
多线程多进程读写同一个文件对象时会有竞争问题,比如一个汉字两个字节,一个线程读取到了前一个字节,指针 ...

明天我再试试,有结果,继续跟帖。

rsj0315 发表于 2020-10-29 11:26:18

是我在函数里边写的有bug了,我把读取的5个文件夹的数据都写到一个文档里,同时区写入的时候导致数据错乱,导致报错。
当不开启线程的时候,按照顺序执行没问题,开启线程的时候就报错了。

优化:
把每个文件夹的文件写到对应的文档里,就没有这个问题了。同时开启线程进行读写,速度加快了一半,还是挺爽的。
页: [1]
查看完整版本: 开启多进程报错