python利用进程池,多进程拷贝文件

#!/usr/bin/evn python
#Author:ELSON_ZENG

import os,time
import multiprocessing


def copy_file(queue, file_list, old_folder_name, new_folder_name ):
    """完成文件的复制"""
    #print("===>copy文件:从%s ---> %s 文件名是:%s" %(old_folder_name, new_folder_name,file_list))
    f_read =  open(os.path.join(old_folder_name,file_list),'rb')
    f_write = open(os.path.join(new_folder_name,file_list),'wb')
    while True:
        content = f_read.read(1024)
        if content:
            f_write.write(content)
        else:
            break
    f_write.close()
    f_read.close()
    #拷贝完文件,那么就想队列中写入一个消息
    queue.put(file_list)


def main():
    #1、获取用户要copy的文件夹的名字
    old_folder_name = input("请输入要copy的文件夹名字:")
    proccess_num = int(input("请输入要开启的进程数量:"))
    #2、创建一个新的文件夹
    try:
        new_folder_name = old_folder_name + '_RS'
        os.mkdir(new_folder_name)
    except:
        pass

    #3、获取文件夹的所有的待copy的文件名字 listdir()
    file_lists = os.listdir(old_folder_name)

    #4、创建进程池
    p = multiprocessing.Pool(proccess_num)
    # 5、 创建队列
    queue = multiprocessing.Manager().Queue()

    #5、向进程池中添加copy文件的任务
    for file_list in file_lists:
        p.apply_async(copy_file, args=(queue, file_list, old_folder_name, new_folder_name ))

    print('-----start-----')
    p.close()
    start_time = time.time()
    #p.join()
    file_num = len(file_lists)
    copy_num = 0
    while True:
        file_name = queue.get()
        copy_num += 1
        stop_time = time.time()
        print('
拷贝进度为 %.2f %%, 总耗时 %d 秒。' %(copy_num/file_num*100,stop_time - start_time),end = '')
        if file_num == copy_num:
            break
    print('
-----stop------')


if __name__ == "__main__":
    main()

  

原文地址:https://www.cnblogs.com/elson-zeng/p/13474437.html