进程池案例:多任务文件夹复制-显示进度条-理解和分析

实验环境:linux系统、python3

实验过程:在工作目录下创建一个test文件夹,将实验文件拷贝其中;在工作目录下创建python文件,将以下代码拷贝其中。

建议:若以下代码阅读遇到困难,可以先去主页阅读文章《进程池案例:多任务文件夹复制-理解和分析》

实验分析:(包含在代码注释中)

代码使用者,若有觉得我分析理解不当之处,欢迎评论区指正;

# 导入所需模块
# zhaohaoqi

import os
import multiprocessing


# 将创建的队列对象作为参数传入复制文件的方法中
def copy_file(queue, 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()

    # 通过queue调用put()方法将复制好的文件传入到队列中待取
    queue.put(file_name)


def main():
    # 获取用户要copy的文件夹的名字
    old_folder_name = input("请输入要copy的文件夹的名字:")

    # 创建新的文件夹
    try:
        new_folder_name = old_folder_name + "[复件]"
        os.mkdir(new_folder_name)
    except:
        pass

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

    # 创建进程池
    po = multiprocessing.Pool(5)

    #  创建一个队列
    queue = multiprocessing.Manager().Queue()

    # 向进程池添加copy文件的任务
    # 这里将创建的队列对象作为参数传入进程池要执行的方法中。
    for file_name in file_names:
        po.apply_async(copy_file, args=(queue, file_name, old_folder_name, new_folder_name))

    po.close()

    # 因为接下来主进程会因为while循环而不能提前结束,所以进程池对象po无需调用join()方法来堵塞主进程的执行
    # po.join()

    # 调用len()方法获得总共要复制的文件数量
    all_file_num = len(file_names)
    # 创建计时器,原来记录复制完成的文件数量
    copy_ok_num = 0
    while True:
        # 每复制完成一份文件,队里中就有一份文件可取
        file_name = queue.get()
        # 每取一次,计数器加一
        copy_ok_num += 1
        # 将复制进度以百分比的形式打印,实现进度显示
        # \r的作用可以实现每次打印将上一次打印的结果覆盖,实现复制进度单行显示
        print("\r拷贝的进度为:%.2f %%" % (copy_ok_num*100/all_file_num), end="")
        # 当全部文件复制完成,跳出循环
        if copy_ok_num >= all_file_num:
            break

    print()


if __name__ == "__main__":
    main()

上一篇:bloofoxCMS 代码审计


下一篇:c++ Message与Folder 拷贝 析构(没有动态空间的类)