单线程递归拷贝:
import os from multiprocessing import Pool,Queue import time #记录拷贝次数 num=0 #拷贝文件 def cp(type,cide): ''' :param type: 拷贝文件 :param cide: 目标文件(相对路径 ) :return: ''' global num with open(type,'rb') as cp: rb=cp.read() with open(cide,'wb') as down: down.write(rb) num+=1 print('拷贝第%d个'%num) print(f"拷贝{type}>>>>>{cide}") #对目录以及目录内文件拷贝和递归创建目录 def cp_mkdir(type,mkdir): """ :param type: 被拷贝的目录 :param mkdir: 拷贝到 :return: """ #深度 #记录深度 s=os.listdir(type) os.mkdir(mkdir) print(f"创建文件{mkdir}") for item in s: if '.' in item: #文件名递归拼接 type_new=type+'/'+item mkdir_new=mkdir+'/'+item cp(type_new,mkdir_new) else: # 目录递归拼接 type_new = type + '/' + item mkdir_new=mkdir+'/'+item cp_mkdir(type_new,mkdir_new) #文件拷贝入口 if __name__ == '__main__': #记录时间 down_time = time.time() #创建进程池 pool = Pool() pool.apply_async(func=cp_mkdir, args=('img','img_new')) pool.close() pool.join() up_time = time.time() print(up_time - down_time)
线程池循环单线程拷贝:
""" 练习2 : 拷贝一个目录 编写程序完成,将一个文件夹拷贝一份 * 假设文件夹中只有普通文件 * 将每个文件的拷贝作为一个拷贝事件 * 使用进程池完成事件 提示 : os.mkdir('name') """ from multiprocessing import Pool,Queue import os,sys import time q = Queue() # 创建消息队列 # 拷贝一个文件 def copy(file,old_folder,new_folder): fr = open(old_folder+'/'+file,'rb') fw = open(new_folder+'/'+file,'wb') while True: data = fr.read(1024) if not data: break n = fw.write(data) # 写入多少就是拷贝多少 q.put(n) # 放入消息队列 fr.close() fw.close() # 获取文件夹大小 def get_size(dir): total_size = 0 for file in os.listdir(dir): total_size += os.path.getsize(dir+'/'+file) return total_size # 使用进程池 def main(): old_folder = input("你要拷贝的目录:") # 文件夹大小 total_size = get_size(old_folder) new_folder = old_folder + "-备份" try: os.mkdir(new_folder) except: sys.exit("该目录已存在") # 创建进程池 pool = Pool() # 遍历目录,确定要拷贝的文件 for file in os.listdir(old_folder): pool.apply_async(func=copy,args=(file,old_folder,new_folder)) copy_size = 0 # while copy_size < total_size: # copy_size += q.get() # 从消息队列获取数值累加 # print("拷贝了 %.2f%%"%(copy_size/total_size*100) pool.close() pool.join() if __name__ == '__main__': down_time = time.time() main() up_time = time.time() print(up_time-down_time)