备注:主要要弄清楚需求是做什么。多进程,主要是用什么实现,怎么实现,这里用的进程池来实现。文件在文件夹里面就申请进程池,加入任务,开始执行,至于拷贝过程就是普通的文件读写操作了
#创建文件夹
#2获取old文件夹中所有的文件的名字
#3.使用多进程方式,copy所有文件到新的文件夹:中
import os
from multiprocessing import Pool
from multiprocessing import Manager
def copyFileTask(name,oldFolderName,newFoldName,queue):#完成拷贝文件的内容
fr=open(oldFolderName+"/"+name,"r") #打开老文件,要拷贝的文件
# print(fr)
fw=open(newFoldName+"/"+name,"w")#打开新文件,拷贝的目的文件
# print(fw)
content=fr.read() #读
#print(content)
fw.write(content)#写
# print("写文件")
fr.close()
fw.close()
queue.put(name) #拷贝的文件名扔进队列。方便之后计算拷贝进度
def main():
#0#获取用户要copy的文件夹的名字#os.path.dirname(os.getcwd()))获取上级目录
oldFolderName=input("请输入文件夹的名字:")
# print(os.getcwd())
#创建文件夹
newFoldName=oldFolderName+'_复件'
os.mkdir(newFoldName)
#2获取old文件夹中所有的文件的名字
fileNames=os.listdir(oldFolderName)
print("当前文件列表%s"%fileNames)
# print(os.listdir())
#3.使用多进程方式,copy所有文件到新的文件夹中
pool=Pool(5) #初始化进程池,最多容纳五个任务
queue=Manager().Queue() #初始化队列,为了计算进度而用
for name in fileNames:#拷贝的文件在文件夹里面
#申请进程池空间,创建子进程任务,非堵塞apply_async申请
pool.apply_async(copyFileTask,args=(name,oldFolderName,newFoldName,queue))
# pool.close() 关闭进程池
# pool.join() 进程池中的任务执行结束后再接着执行下面的代码
num=0
allnum=len(fileNames)
print("当前文件夹的长度%d"%allnum)
while True:
queue.get() #出队列,能够出队列表示copy成功,队列不为空
num +=1 #出一次队列,计数一次,为了计算进度
copyRate=num/allnum
#print("\r%.2f%%" %(copyRate*100), end='')
print("\r复制copy进度条是:%.2f%%"%(copyRate*100),end="") #打印进度条
if num==allnum:
break
print("=====已完成拷贝---")
if __name__=="__main__":
main()
centos中的执行后结果:
[root@localhost ~]# python 多进程copy文件.py
请输入文件夹的名字:python_xuexi
当前文件列表['hello.py', 'testa.py', '01-fork.py', '02-fork.py', '03-修改全局变量fork.py', '04-fork.py', '05-fork炸弹.py', '06_Process.py', '07_process_class.py', '08_pool.py', '09_pool.py']
当前文件夹的长度11
复制copy进度条是:9.09%=====已完成拷贝---
复制copy进度条是:18.18%=====已完成拷贝---
复制copy进度条是:27.27%=====已完成拷贝---
复制copy进度条是:36.36%=====已完成拷贝---
复制copy进度条是:45.45%=====已完成拷贝---
复制copy进度条是:54.55%=====已完成拷贝---
复制copy进度条是:63.64%=====已完成拷贝---
复制copy进度条是:72.73%=====已完成拷贝---
复制copy进度条是:81.82%=====已完成拷贝---
复制copy进度条是:90.91%=====已完成拷贝---
复制copy进度条是:100.00%[root@localhost ~]# cat 进