此贴用于研究多进程和单进程拷贝大量文件的效率问题
首先建立test文件夹,然后使用下列代码批量创建200个py文件
#创建200个文件
i = 0
while i < 200:
o = open("test/"+str(i)+".py","w")
content = str(i);
o.write(content)
o.close()
i += 1
一:使用进程池Pool拷贝文件
下列代码中将创建5个进程用于拷贝文件
from multiprocessing import Pool,Manager
import time
import os
import shutil
import random
start = time.time()
#从源文件夹复制到目标文件夹
def copyFile(file_name,old_folder_name,new_folder_name,q):
time.sleep(random.random())
shutil.copyfile(old_folder_name+"/"+file_name,new_folder_name+"/"+file_name,)
q.put(file_name)
def main():
#创建Pool
pool = Pool(5)
#创建小心队列
q = Manager().Queue()
#获取待拷贝的文件夹名
old_folder_name = input("请输入你要拷贝的文件夹名称:")
#组装目标文件夹名称
new_folder_name = old_folder_name + "-复制"
os.mkdir(new_folder_name)
file_name_list = os.listdir(old_folder_name)
for value in file_name_list:
pool.apply_async(copyFile,args=(value,old_folder_name,new_folder_name,q))
count = 0
allLength = len(file_name_list)
while count < allLength:
message = q.get()
count += 1
print("\r正在拷贝%s,拷贝的进度是:%d%%"%(message,(count/allLength)*100),end="")
print("\n拷贝完毕")
if __name__ == "__main__":
main()
end = time.time()
print("多进程花费的时间:%#.2fs"%(end-start))
执行代码后,运行结果为:
请输入你要拷贝的文件夹名称:test
正在拷贝132.py,拷贝的进度是:100%
拷贝完毕
多进程花费的时间:25.05s
此时可以得知多进程拷贝200个文件总花费时间为25.05s.
二:使用单进程批量拷贝文件
import time
import os
import shutil
import random
start = time.time()
#从源文件夹复制到目标文件夹
def copyFile(file_name,old_folder_name,new_folder_name):
time.sleep(random.random())
shutil.copyfile(old_folder_name+"/"+file_name,new_folder_name+"/"+file_name,)
def main():
#获取待拷贝的文件夹名
old_folder_name = input("请输入你要拷贝的文件夹名称:")
#组装目标文件夹名称
new_folder_name = old_folder_name + "-复制"
os.mkdir(new_folder_name)
file_name_list = os.listdir(old_folder_name)
count = 0
allLength = len(file_name_list)
for value in file_name_list:
copyFile(value,old_folder_name,new_folder_name)
count += 1
print("\r正在拷贝%s,拷贝的进度是:%d%%" % (value, (count / allLength) * 100), end="")
print("\n拷贝完毕")
if __name__ == "__main__":
main()
end = time.time()
print("单进程花费的时间:%#.2fs"%(end-start))
上段代码的执行结果:
请输入你要拷贝的文件夹名称:test
正在拷贝98.py,拷贝的进度是:100%
拷贝完毕
单进程花费的时间:99.66s
由两段代码的执行结果来看,对于大批量文件,多进程效率是单进程效率4倍左右。
注意:倍数不是绝对的,由电脑硬件,文件数以及其他因素共同决定的