利用多线程和多进程实现文件的复制(简易版)

用到的模块

os实现文件的读写操作
mulitprocessing 创建进程对象
threading 创建线程对象
思考:怎样入手呢?
要想进行文件的复制,那么我们先来了解一下如何进行文件的读写操作。就好像我们手动复制一个文件一样,第一步打开这个文件,读取这个文件的每一行,最后关闭这个文件。
# 我们将写好的读写文件封装成一个函数,实现了文件的复制功能。方便以后调用。

# rpath可以是要进行复制的源文件或者路径
# wpath 是要写入的文件(目标文件)或路径
def copyFile(rPath,wPath):

    # 以二进制读的方式打开一个文件或路径
    fr = open(rPath,"rb")
    # 以二进制写的文件打开一个文件或路径
    fw = open(wPath,"wb")

    # 读取打开的文件fr内容,将内容赋值给context
    context = fr.read()
    # 将context的内容写入到fw文件中
    fw.write(context)
    
    # 关闭文件
    fr.close()
    fw.close()

# r代表忽略大小写
path = r"C:\Users\Champion\Desktop\学习代码"  # 路径
topath = r"C:\Users\Champion\Desktop\copyText"
# path = r"C:\Users\Champion\Desktop\学习代码\copyDemo.txt"  # 文件
# topath = r"C:\Users\Champion\Desktop\copyText\copyDemo.txt"

读path路径下的所有文件

fileList = os.listdir(path)

for循环处理每个文件 进行拷贝

for fileName in fileList:
    copyFile(os.path.join(path,fileName),os.path.join(topath,fileName))

ok!到这里一个通过原始的方式实现文件的拷贝就完成了。
其实这种方式就是一种通过单进程的方式进行拷贝的,是系统默认执行的。

接下来使用多进程的方式来进行文件的拷贝。
为哈要使用多进程?多进程也就意味着多任务,会提高运行效率。
比如说我们要进行一个1GB文件的复制,通过单进程的模式我们复制大约需要30s。
但是我们如果通过多进程比如说四个进程同时来进行文件的拷贝,大约需要十几秒。

如果你发现通过两种方式复制文件的效率差不多,甚至通过多线程的方式花费时间还要更久一点,那么只有一个问题,就是你的文件不够大。手动滑稽0.0.0.0…0…00

import os,time
from multiprocessing import Process,Pool
import threading

# 拷贝单个文件

# arguments包  可以进行传参
def copyFile(rPath,wPath):
    fr = open(rPath,"rb")
    fw = open(wPath,"wb")

    context = fr.read()
    fw.write(context)

    fr.close()
    fw.close()

path = r"C:\Users\Champion\Desktop\学习代码"
topath = r"C:\Users\Champion\Desktop\copyText"
# path = r"C:\Users\Champion\Desktop\学习代码\copyDemo.txt"
# topath = r"C:\Users\Champion\Desktop\copyText\copyDemo.txt"

'''
# 实现单进程的文件拷贝
# 读path路径下的所有文件
fileList = os.listdir(path)
# for循环处理每个文件 进行拷贝
for fileName in fileList:
    copyFile(os.path.join(path,fileName),os.path.join(topath,fileName))
'''


# 多进程拷贝 文件夹下的所有文件
if __name__ == "__main__":
    fileList = os.listdir(path)

    # 创建进程池  统一管理进程池中的进程
    pp = Pool(2)
    for fileName in fileList:
        # 创建进程
        pp.apply_async(copyFile,args=(os.path.join(path,fileName),os.path.join(topath,fileName)))
    pp.close()
    pp.join()
    print("主进程结束")



'''
# 单线程拷贝文件
if __name__ == "__main__":
    print("主线程%s启动"%(threading.current_thread()))
    start = time.time()
    p = threading.Thread(target=copyFile,name="copy",args=(path,topath))
    print("子线程%s启动"%(threading.Thread.name))
    p.start()
    p.join()
    end = time.time()

    # time.sleep(2)
    print("子线程%s拷贝结束,共耗时%.2fs"%(threading.Thread.name,(end-start)))  # 3.41s
    # p.join()
    print("主线程%s结束"%(threading.current_thread()))
'''

你可能感兴趣的:(python)