多进程教程练习,某目录下,20个文件,每个文件62M,共1.21G。拷贝至另一处。
单进程结果
编号为8028的进程,运行时长: 6.34秒。
多进程结果
有20个文件就生成20个进程。
运行时长: 0.36~3.79秒。
进程池结果
pool = multiprocessing.Pool() # 无参,使用CPU所有核,6核。
运行时长: 0.3~3.21秒。
pool = multiprocessing.Pool(processes=1)
运行时长: 0.16~0.96秒。
pool = multiprocessing.Pool(processes=2)
运行时长: 0.53~0.82秒。
pool = multiprocessing.Pool(processes=3)
运行时长: 0.62~2.08秒。
pool = multiprocessing.Pool(processes=4)
运行时长: 0.89~2.74秒。
现已知,多进程时3.8秒完成。
进程池中有一个或两个进程时,效率最高,均在1秒内完成。进程越多反而效率在下降。
import os
import multiprocessing
import time
from functools import partial
def copy_file(source_dir, dest_dir, filename):
source_path = source_dir + "\\" + filename
dest_path = dest_dir + "\\" + filename
start_time = time.time()
with open(source_path, "rb") as source_file:
with open(dest_path, "wb") as dest_file:
while True:
data = source_file.read(1024) # 源文件每次读1k数据
if data:
dest_file.write(data)
else:
break
end_time = time.time()
execution_time = end_time - start_time
print(f"编号为{os.getpid()}的进程,运行时长: {round(execution_time, 2)}秒。")
if __name__ == '__main__':
source_dir = r"D:\6"
dest_dir = r"C:\Users\xcxc\Desktop\six"
try:
os.mkdir(dest_dir)
except:
print("目标文件夹已经存在。")
file_list = os.listdir(source_dir)
# for file_name in file_list:
# # copy_file(file_name, source_dir, dest_dir)
# sub_process = multiprocessing.Process(target=copy_file,
# args=(file_name, source_dir, dest_dir))
# sub_process.start()
filename_list = list(file_name for file_name in file_list)
func = partial(copy_file, source_dir, dest_dir)
pool = multiprocessing.Pool(processes=4)
pool.map(func, filename_list)