Python 进程池拷贝目录下所有普通文件,并实时打印拷贝的百分比速度

思路:有一个文件,就向进程池中去添加一个事件

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()
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值