自学python实例_多进程实现多任务文件夹的copu_显示完成进度

今天,用多进程来实现,一个文件的copy过程!同时,了解一个新东西,叫进程池.进程池,简单的说,就是创建了一个空间我规定了,这个进程池里面,只能有多少个进程同时开始,比如我规定了最多可以有5个进程同时任务,那么就只能5个.这5个里面走一个,就可以进一个,还没等到的就堵塞.当最后一个进程结束时,全部任务完成.
需要尝试的人,要自己创建一个test文件夹,用来被copy,注意,文件不要太大,只是用来了解!!

import os
import multiprocessing

def copy_file(q, file_name, old_folder_name, new_folder_name):
	"""完成文件额复制"""
	#print("---copy文件---%s -- >>> %s: 拷贝:%s " % (old_folder_name, new_folder_name, file_name))  # 进程池里面异常了,不会报错误
	old_f = open(old_folder_name + "/" + file_name, "rb")
	content = old_f.read()
	old_f.close
	new_f = open(new_folder_name + "/" + file_name, "wb")
	new_f.write(content)
	new_f.close()
	# 如果拷贝完了文件,就向队列中写入一个消息,表示完成
	q.put(file_name)

def main():
	# 1. 获取用户要copy的文件夹的名字
	old_folder_name = input("请输入要copy的文件夹名字:")
	# 2. 创建一个新的文件夹
	try:
		new_folder_name = old_folder_name + "[复件]"
		os.mkdir(new_folder_name)
	except:
		pass
	# 3. 获取文件夹的所有待copy的文件夹名字 os.listdir()
	file_names = os.listdir(old_folder_name)
	#print(file_names)
	# 4. 创建进程池
	po = multiprocessing.Pool(5)
	# 5. 创建队列
	q = multiprocessing.Manager().Queue()
	# 向进程池中添加 copy的任务
	for file_name in file_names:
		po.apply_async(copy_file, args=(q, file_name, old_folder_name, new_folder_name))
	po.close()
	# po.join()
	all_fil_num = len(file_names)  # 检查一下文件数量
	copy_ok_num = 0
	while True:
		file_name_over = q.get()
		#print("已经完成copy:%s" % file_name_over)
		copy_ok_num += 1 
		print("\rcopy的进度为: %0.2f %%" %(copy_ok_num*100/all_fil_num), end="")
		if copy_ok_num == all_fil_num:
			break
	print()

if __name__ == "__main__":
	main()

为了让,代码不要显示太长,我减少了一些必要的缩进!
必要的注释都有,首先说函数 copy_file()
先要读 发过来的文件,这里可以加上try或者with以防万一程序操作失败,出现意味的情况,下面写入新的文件也是一样可以,加try或者with.
然后,就是我们main函数,最下面的print输出,显示完成情况,可以提供大家参考,以这样的方式,就可以不换行的变更显示的情况,为了效果更加明显,test文件夹里面,自己要准备多一个小文件!!!
最后,注意! 第2526行
3. 获取文件夹的所有待copy的文件夹名字 os.listdir()
file_names = os.listdir(old_folder_name)

操作是在这个程序当前文件夹下的,也就是说,你自己准备的test文件夹,要和这个程序同一个文件夹!

你可能感兴趣的:(python,python,队列,多线程,多进程)