采用网上的一个利用复制文件来检测多进程和单进程差异的例子。但是例子中许多关键的解释并未给出,反而给入门新手造成了很多不必要的困扰和门槛。
以下的解释重点有两个,1是怎么运行多进程(我测试了多台电脑,具体为什么运行不了,我也不知道,只能按照我自己的方法解释如何可以在我测试的几台电脑上运行)。2是关键性的代码解读。
第一个问题的解答:首先,创建两个工程文件,一个是单进程,一个是多进程。其中多进程无法使用选中部分代码然后ctrl+enter的方式运行,必须运行全部代码,在工程文件上方的运行按钮运行。
其中多进程代码:
# -*- coding: utf-8 -*-
"""
Created on Wed Aug 28 18:00:53 2019
@author: Administrator
"""
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(5)
q = Manager().Queue()
old_folder_name = 'D:/minxinan/temp1'
new_folder_name = 'D:/minxinan/temp2'
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))
其中,单进程代码
# -*- coding: utf-8 -*-
"""
Created on Sun Sep 1 21:54:57 2019
@author: Administrator
"""
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 = 'D:/minxinan/temp1'
new_folder_name = 'D:/minxinan/temp3'
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))
运行结果对比:
对于第二部分的解释:
解释:
其中代码中的copyFile函数中有一句:
time.sleep(random.random())
这是造成时间差异的关键,是这句代码造成的文件复制速度慢(不论是单进程还是多进程),速度慢的目的是为了检验多进程速度比单进程快,为什么呢?因为
1, time.sleep相当于暂停,单进程复制50个文件,暂停了50次,而多进程复制只有暂停了12.5次,所以速度快了。
2,文件复制属于io密集型处理,不是多进程擅长的,如果把 time.sleep去掉,单进程的速度会比多进程快。
以上大致就是为什么加 time.sleep来测试多进程的原因。
我的内容已经很入门了。。。。