@

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("\r%.2f...(%s)" % (copy_rate, file_name) + " "*50, end="")
if copy_rate >= 100:
break
print() if __name__ == "__main__":
main()

注意

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

引入进度条概念

最新文章

  1. 【EM算法】EM(转)
  2. PS 零基础训练1
  3. app 尺寸
  4. DIV与CSS布局需知
  5. .git 目录文件介绍
  6. angularJS promise $q
  7. 登录DSCCC控制台报错提示:安装错误代码: 3
  8. WTL---WxWidget---MFC 何去何从
  9. EasyUi中的datagird中a标签的click事件无法触发?(已解决)
  10. python绘制图
  11. python list用法
  12. 保存后自动格式化代码(vscode)
  13. linux 统计某目录文件的行数
  14. mysql 数据库设计
  15. Linux 命令详解(十一)Shell 解析 json命令jq详解
  16. Postfix邮件服务 - DNS配置
  17. exec函数族的作用与讲解
  18. leetcode999
  19. 一次SQLServer数据库宕机问题
  20. 最近5年183个Java面试问题列表及答案[最全]

热门文章

  1. 安装Ubuntu16.04系统后分辨率底的问题
  2. 让mac电脑更简单运行Windows软件的CrossOver,优势知多少?
  3. 肝了一周的 UDP 基础知识终于出来了。
  4. 【Makefile】5-Makefile变量的基础
  5. 在Windows下使用CodeBlock使用libiconv第三方库
  6. 网络篇:朋友面试之TCP/IP,回去等通知吧
  7. zuul1.x和gateway的区别
  8. How tomcat works(深入剖析tomcat)生命周期Lifecycle
  9. Fiddler 4的安装
  10. 老猿学5G:多量纲计费与QoS的QCI、5QI、ARP、GBR和MBR