zoukankan      html  css  js  c++  java
  • 多任务-python实现-多进程文件拷贝器(2.1.10)

    @

    1.需求

    当去拷贝一个文件夹的所有文件时,使用多任务拷贝
    假如一个文件使用一个进程处理
    10000个文件就额可以使用最大值为10的进程池处理(当然max取值看具体主机性能)
    提高工作效率

    2.代码

    import multiprocessing
    import os
    import time
    import random
    
    
    def copy_file(queue, file_name,source_folder_name,  dest_folder_name):
        """copy文件到指定的路径"""
        f_read = open(source_folder_name + "/" + file_name, "rb")
        f_write = open(dest_folder_name + "/" + file_name, "wb")
        while True:
            time.sleep(random.random())
            content = f_read.read(1024)
            if content:
                f_write.write(content)
            else:
                break
        f_read.close()
        f_write.close()
    
        # 发送已经拷贝完毕的文件名字
        queue.put(file_name)
    
    
    def main():
        # 获取要复制的文件夹
        source_folder_name = input("请输入要复制文件夹名字:")
    
        # 整理目标文件夹
        dest_folder_name = source_folder_name + "[副本]"
    
        # 创建目标文件夹
        try:
            os.mkdir(dest_folder_name)
        except:
            pass  # 如果文件夹已经存在,那么创建会失败
    
        # 获取这个文件夹中所有的普通文件名
        file_names = os.listdir(source_folder_name)
    
        # 创建Queue
        queue = multiprocessing.Manager().Queue()
    
        # 创建进程池
        pool = multiprocessing.Pool(3)
    
        for file_name in file_names:
            # 向进程池中添加任务
            pool.apply_async(copy_file, args=(queue, file_name, source_folder_name, dest_folder_name))
    
        # 主进程显示进度
        pool.close()
    
        all_file_num = len(file_names)
        while True:
            file_name = queue.get()
            if file_name in file_names:
                file_names.remove(file_name)
    
            copy_rate = (all_file_num-len(file_names))*100/all_file_num
            print("
    %.2f...(%s)" % (copy_rate, file_name) + " "*50, end="")
            if copy_rate >= 100:
                break
        print()
    
    
    if __name__ == "__main__":
        main()
    
    

    注意
    引入queue的原因是,主进程和子进程有通信的需求,需要查看还有文件拷入与否
    引入进度条概念

  • 相关阅读:
    干嘛
    有一种姑娘 你只想温柔以待
    衡阳拜佛
    浅谈程序员的英语学习【转】
    linux下用C编写的基于smtp的邮件发送程序【转】
    清空消息队列的缓存buffer
    不要对C++类对象或struct对象做memset操作
    xml解析编辑网站
    gdb调试
    喂狗机制 Software Dog
  • 原文地址:https://www.cnblogs.com/simon-idea/p/11357311.html
Copyright © 2011-2022 走看看