【进程 07】单进程拷贝文件与多进程拷贝文件的优劣(适用情况)
程序员文章站
2022-05-03 20:03:45
...
单线程模式
import os
import time
def copyFile(rPath, wPath):
fr = open(rPath, 'rb')
fw = open(wPath, 'wb')
content = fr.read()
fw.write(content)
fr.close()
fw.close()
path = r'D:\pic'
toPath = r'./pic1'
# 读取path下所有文件
fileList = os.listdir(path)
# 使用for in
start = time.time()
for fileName in fileList:
copyFile(os.path.join(path, fileName), os.path.join(toPath, fileName))
end = time.time()
print('总耗时:%0.2f' % (end - start))
代码讲解如下:
- 导库 os time os操作系统文件 time计算耗费时间
- 创建方法 用于读写文件 拷贝就是读出来写进去
- 设置读写路径
- os.listdir 方法可以读到 path 下的文件名(注意是文件名)返回的是列表
- 设置起始时间 start
- 遍历文件名列表
- 调用方法 调用的过程中,使用了路径拼接的方法,把 path 和 文件名 拼起来就是一个完整的路径
- 计算结束时间 end
- 求的总耗时
多线程模式
import os
import time
from multiprocessing import Pool
def copyFile(rPath, wPath):
fr = open(rPath, 'rb')
fw = open(wPath, 'wb')
content = fr.read()
fw.write(content)
fr.close()
fw.close()
if __name__ == '__main__':
path = r'D:\pic'
toPath = r'./pic'
# 读取path下的所有文件
fileList = os.listdir(path)
start = time.time()
p = Pool(2)
for fileName in fileList:
p.apply_async(copyFile, args=(os.path.join(path, fileName),
os.path.join(toPath, fileName)))
p.close()
p.join()
end = time.time()
print('总耗时%0.2f' % (end - start))
# 创建进程比较耗费时间
代码讲解如下:
- 前边大同小异,多导一个 Pool
- 从计时开始 模拟了双核 同时执行两个任务
- 遍历列表,拷贝每一个文件都产生一个进程
- 计算总耗时
结论:
-
并不是任何情况使用多进程就好,因为创建进程本身比较耗费时间
- 适用多进程的情况:单个文件较大,总拷贝数量较少(例如拷贝视频)如果是拷贝图片,数量很多。
- 如果单个文件很小,使用多进程的话会浪费大量的时间创建进程