zoukankan      html  css  js  c++  java
  • 利用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('
    进度为{:.2f}%%'.format(progress_bar),end='')
            if copy_completed_num>=all_file_num:
                break
        print()
    
    if __name__=='__main__':
        main()

    3、模拟运行

      

       完成

  • 相关阅读:
    转!!CSRF攻击与防御(写得非常好)
    quartz集群 定时任务 改成可配置
    原!!将集合分段处理
    CentOS 6.5 下安装 Redis 2.8.7
    四层和七层负载均衡的区别介绍(转载)
    使用中值滤波原理过滤异常数据
    ThinkPHP5 <= 5.0.22 远程代码执行高危漏洞
    ThinkPHP 小于5.0.24 远程代码执行高危漏洞 修复方案
    nginx 下载 大文件被截断
    mysql 存储过程 有数据修改 没数据插入
  • 原文地址:https://www.cnblogs.com/nuochengze/p/12639596.html
Copyright © 2011-2022 走看看