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()