利用Pool和Queue创建的多文件复制器

1、准备

  本地创建一个测试文件夹

mkdir test

  将大量文件复制进入测试文件夹,作测试用

cp /usr/bin/python3.6/* ./test/

2、写入代码

import os
import multiprocessing

def copy_file(que,file_name,old_folder_name,new_folder_name):
    """完成文件的复制"""
    # print("->>>>>模拟复制文件:从{}拷贝到{},文件名是{}".format(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()

    # 如果拷贝完成了文件,那么就向队列中写入一个消息,表示已经完成
    que.put(file_name)

def main():
    # 获取用户要copy的文件夹的名字
    old_folder_name = input('请输入要copy的文件夹的名字:')
    # 创建一个新的文件夹
    try:
        new_folder_name = old_folder_name+"(1)"
        os.mkdir(new_folder_name)
    except:
        pass
    # 获取文件夹的所有的待copy的文件名字 listdir()
    filename_waitting_by_copy = os.listdir(old_folder_name)
    # 创建进程池
    po = multiprocessing.Pool(10)
    # 创建一个队列
    que = multiprocessing.Manager().Queue()
    # 想进程池中添加copy文件的任务
    for file_name in filename_waitting_by_copy:
        po.apply_async(copy_file,args=(que,file_name,old_folder_name,new_folder_name))

    po.close()
    # po.join()
    all_file_num = len(filename_waitting_by_copy)
    copy_completed_num = 0
    while True:
        file_name =que.get()
        copy_completed_num+=1
        progress_bar = (copy_completed_num*100/all_file_num)
        # print('已经完成{}的复制===>>>>>>进度为{:.2f}%%'.format(file_name,progress_bar))
        print('\r进度为{:.2f}%%'.format(progress_bar),end='')
        if copy_completed_num>=all_file_num:
            break
    print()

if __name__=='__main__':
    main()

3、模拟运行

  

 

   完成

posted @ 2020-04-05 22:32  Norni  阅读(229)  评论(0编辑  收藏  举报