引子
最近看python系统编程相关,在学习多进程期间,使用pool完成多进程拷贝文件时,遇到几个蜜汁错误,有的明白,有的不明白,不多大体最终还是实现的最终效果。就留下错误的说明吧。代码附在最后。
一、出现的主要原因
python的线程池,遇到错误不停止,也是让我我奇怪,然后程序一直卡着,执行的拷贝也是乱七八糟的。
1、拷贝的图片内容为空白
主要是读取、写入方式没有按二进制来,然后读取已经出错,可是线程还是一直在执行
2、用来统计的queue.put(new_name)必须放到最前面才有效果
原因如上
2、开始pool任务以后,程序没有任何反应,卡在命令行窗口
原因如上
……所以,其实最终的我遇到的所有奇怪的地方,上面原因1解决了,就好了(黑人问号脸.jpg)
二、代码
import os
from multiprocessing import Pool,Manager
import time
def copyFileTask(old_path,new_name,queue):
"完成拷贝一个文件的功能"
#为什么 放到最后就会卡住??
#print(old_path)
#print(new_name)
#sleep(100)
fr = open(old_path,"rb+")
fw =open(new_name,"wb+")
content = fr.read()
fw.write(content)
fr.close()
fw.close()
queue.put(new_name)
def main():
#0.获取用户输入
oldFolderName = input
#1创建文件夹
newFolderName = oldFolderName.split('\\')[-1]+"-复件"
#print(newFolderName)
if not os.path.exists(newFolderName):
os.mkdir(newFolderName)
#2.获取old文件夹中的所有文件
fileNames = os.listdir(oldFolderName)
#print(fileNames)
#3.多进程拷贝
#t_start = time.time()
#1的时候是 0.82
#5的时候是 0.31
pool=Pool(5)
queue = Manager().Queue()
for name in fileNames:
pool.apply_async(copyFileTask,args=
(os.path.join(oldFolderName,name),
os.path.join(os.path.realpath(newFolderName),
name),
queue
,))
#t_stop = time.time()
#print("添加完毕,耗时%0.2f"%(t_stop-t_start))
#t_start = time.time()
#pool.close()
#pool.join()
#t_stop = time.time()
#print("执行完毕,耗时%0.2f"%(t_stop-t_start))
#4.打印进度
num=0
allNum=len(fileNames)
while num < allNum:
queue.get()
num+=1
copRate=num/allNum
print('\rcopy的进度是:%.2f%%'%((copRate*100)),end="")
if __name__=="__main__":
main()
就是这样