今天,用多进程来实现,一个文件的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文件夹,要和这个程序同一个文件夹!