进程(涉及到进程池,队列)-文件夹拷贝

1 篇文章 0 订阅
1 篇文章 0 订阅

vim编辑器

  1 import os                                                                  
  2 from multiprocessing import Pool
  3 
  4 
  5 def cp(file_name,old_filename,new_filename):
  6     #模拟复制文件
  7     #print("从"+old_filename+"拷贝文件:"+file_name+"到"+new_filename)
  8    
  9     #真实复制文件
 10     fb=open(old_filename+"/"+file_name,"rb")
 11     content=fb.read()
 12     fb.close()
 13     
 14     nb= open(new_filename+"/"+file_name,"wb")
 15     nb.write(content)
 16     nb.close()
 17 
 18 def main():
 19     #1.获取要拷贝文件夹的名字
 20     old_filename=input("请输入要拷贝的文件夹")
 21 
 22     #2.创建要拷贝的文件夹,我们在测试时要是test1存在,每次都要删除,很麻烦,
    那么我们可以用try.
 23     try:
 24         new_filename=old_filename+"1"
 25         os.mkdir(new_filename)
 26     except:
 27         pass
 28 
 29     #3.获取要拷贝文件夹内所有的文件
 30     file_names=os.listdir(old_filename)
 31     # print(file_names)
 32     
 33 
 34     #4.创建进程池
 35     p=Pool(3)
 36     
 37     #5.向进程池中添加任务
 38     for file_name in file_names:
 39         p.apply_async(cp,args=(file_name,old_filename,new_filename))
 40 
 41     p.close()
 42     p.join()
 43 
 44 if __name__=="__main__":
 45     main()    

改进让其有进度条的显示:
注意:如果你是用进程池实现多任务,且实现进程间通信,就不能直接从multiprocessing里的Queue方法,而是用Manager()创建的对象里面的Queue()方法。

  1 import os                                                                  
  2 from multiprocessing import Pool,Manager
  3 
  4 
  5 def cp(q,file_name,old_filename,new_filename):
  6     #模拟复制文件
  7     #print("从"+old_filename+"拷贝文件:"+file_name+"到"+new_filename)
  8 
  9     #真实复制文件
 10     fb=open(old_filename+"/"+file_name,"rb")
 11     content=fb.read()
 12     fb.close()
 13 
 14     nb= open(new_filename+"/"+file_name,"wb")
 15     nb.write(content)
 16     nb.close()
 17 
 18     q.put(file_name)
 19 
 20 def main():
 21     #1.获取要拷贝文件夹的名字
 22     old_filename=input("请输入要拷贝的文件夹")
 23 
 24     #2.创建要拷贝的文件夹,我们在测试时要是test1存在,每次都要删除,很麻烦,
    那么我们可以用try.
 25     try:
 26         new_filename=old_filename+"1"
 27         os.mkdir(new_filename)                                             
 28     except:
 29         pass
 30 
 31     #3.获取要拷贝文件夹内所有的文件
 32     file_names=os.listdir(old_filename)
 33     # print(file_names)
 34 
 35 
 36     #4.创建进程池
 37     p=Pool(3)
 38 
 39     #5.用队列来接收信息
 40     q=Manager().Queue()
 41 
 42 
 43     #6.向进程池中添加任务
 44     for file_name in file_names:
 45         p.apply_async(cp,args=(q,file_name,old_filename,new_filename))
 46 
 47     p.close()
 48 
 49 
 50     #定义一个变量表示文件夹内文件的个数
 51     ol_num=len(file_names)
 52 
 53     ne_num=0
 54     #显示下载进度条
 55     while True:
 56         file_name=q.get()
 57         #以后可以完善,把它在一个页面显示出来
 58         #print(file_name,end="")
 59         
 60         ne_num+=1
 61         #\r的作用是,回到行的行首,让print只打印一行,看着美观
 62         print("\r已拷贝完%.2f%%"%(ne_num*100/ol_num),end="")     
 63         if  ne_num>=ol_num:
 64             break
 65 
 66         print()
 67 
 68 if __name__=="__main__":
 69     main()   

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值