思路:有一个文件,就向进程池中去添加一个事件
from multiprocessing import Pool
import os
#创建消息队列,将子进程中各个文件的拷贝进度发送给父进程,否则父进程无法统计拷贝进度
q = Queue()
#拷贝文件事件函数,参数从功能出发:需要知道从哪个文件拷贝到哪个文件
def copy_file(file,old_dir,new_dir):
#以只读方式打开原文件
fr = open(old_dir+file,'rb')
#以写方式打开新文件
fw = open(new_dir_file,'wb')
while True:
#读原文件
data = fr.read(1024)
if not data:
break
#向新文件中写
n = fw.write(data) #n是返回值:表示写入的字节数
q.put(n) #将写入的字节数(子进程中)通过消息队列传回给父进程
def main():
#文件目录的上一级目录路径,用于拼接文件路径
path = '/home/xxx/.../'
dir = input('输入要拷贝的文件目录:')
#旧文件目录
old_dir = path + dir +'/'
#新文件目录
new_dir = path + old_dir + '-备份/'
#创建新文件目录
os.mkdir(new_dir)
#获取想要拷贝的文件目录下的所有文件的列表
file_list = os.listdir(path+old_dir)
#获取所有文件大小
total_size = 0
for file in file_list:
total_size += os.path.getsize(old_dir+file)
print('总共大小:%d M'%(total_size/1024//1024)
#创建进程池:指定4个进程
pool = Pool(4)
#有一个文件,就要向进程池中添加一个事件
for file in file_list:
pool.apply_async(copy_file,arg=(file,old_dir,new_dir))
pool.close()
#用一个变量来记录当下已拷贝了多少
copy_size = 0
#循环打印出拷贝了多少
while copy_size<total_size:
copy_size += q.get() #接收子进程拷贝了多少字节
print('拷贝了:%.1f%%' %(copy_size/total_size*100))
pool.join()
if __name__ == '__main__':
main()