python中基于多任务的文件复制方法

网络编程中,使用多任务实现文件的复制是非常有必要的。下面将简要介绍两种基于多任务的文件复制实现方式。

1.下面实现的是使用队列实现文件的多任务复制过程

import multiprocessing
import os

def copied_old_folder(q, old_folder_name):
    '''文件复制放入队列中'''
    file_infos = []

    file_names = os.listdir("./" + old_folder_name)  # 路径可以用当前目录中的文件夹名表示,也可以在前面添加'./',表示当前目录
    for file_name in file_names:
        try:
            fr = open("./" + old_folder_name + '/' + file_name, "r")
            file_data = fr.read()
            file_infos.append((old_folder_name, file_name, file_data))
        except Exception as e:
            print("%s文件复制过程出现错误,错误原因是:%s" % (file_name, e))
        else:
            print("%s文件复制完成." % file_name)
        finally:
            fr.close()

    for file_info in file_infos:
        q.put(file_info)
    print("---所有文件数据已经读取并存储到队列中---")

def copy_to_folder(q):
    '''复制数据到新文件夹中'''
    # 从对列中提取数据
    count = 0  # 记录文件个数
    while True:
        file_info = q.get()
        try:
            os.mkdir(file_info[0] + "[复件(队列)]")
        except:
            pass

        try:
            fw = open("./" + file_info[0] + "[复件(队列)]" + "/" + file_info[1], "w")
            fw.write(file_info[2])
            count += 1
        except Exception as e:
            print("%s文件复制过程出现错误,错误原因是:%s" % (file_info[1], e))
        finally:
            fw.close()

        if q.empty():  # 这里不能使用get方法,因为在队列中没有数据的时候不会犯会值,而会堵塞等待
            break
    print("---所有文件共%d已经从队列中复制到新文件夹中---" % count)


def main():
    # 多进程之间通过队列完成进程间通信
    # 创建一个队列
    q = multiprocessing.Queue(10)
    old_folder_name = input("请输入要复制的文件夹:")
    # 创建多个进程,将队列的引用当作实参进行传递到里面
    # old_folder_name = input("请输入要复制的文件夹:")
    # p1 = multiprocessing.Process(target=copied_old_folder, args=(q, old_folder_name))  # 必须在main中定义要复制的文件夹,
    # # 因为在进程中,个进成的执行是没有关系的,

    p1 = multiprocessing.Process(target=copied_old_folder, args=(q, old_folder_name))  # 必须在main中定义要复制的文件夹,
    # 因为在进程中,个进成的执行是没有关系的,
    p2 = multiprocessing.Process(target=copy_to_folder, args=(q,))  # 这里的进程参数需要有队列
    p1.start()
    p2.start()

if __name__ == "__main__":
    main()

2、下面实现的是使用进程池实现文件的多任务复制过程

import os
import time
import random
import multiprocessing
'''使用进程池复制文件'''

def copy_file(copy_file_name, folder_name, new_folder_name):
    '''完成文件到复制'''
    t_start = time.time()

    try:
        fr = open("./" + folder_name + "/" + copy_file_name, "r")
        fw = open("./" + new_folder_name + "/" + copy_file_name, "w")
        try:
            print(">>>>>>%s文件开始复制<<<<<<" % copy_file_name)
            file_content = fr.read()
            fw.write(file_content)
            # time.sleep(random.random()*2)
            t_stop = time.time()
            print(">>>>>>%s文件复制完成,消耗时间为:%.2f<<<<<<" % (copy_file_name, (t_start - t_stop)))
        except Exception as e:
            print("%s文件复制失败,错误原因为:%s" % (copy_file_name, e))
    except Exception as e:
        print("%s文件打开失败,错误原因为:%s" % (folder_name, e))
    finally:
        fw.close()
        fr.close()
    # print("这里被执行===========================================")  # 这里会被执行
def main():
# 获取用户要copy的文件
    folder_name = input("请输入要复制的文件夹:")
    count = 0  # 记录文件个数
# 创建一个新的文件夹
    try:
        new_folder_name = folder_name + "[复件]"
        os.mkdir(folder_name + "[复件]")
    except:
        pass
# 获取文件夹的所有的待copy的文件 listdir()
    file_names = os.listdir(folder_name)  # 获取文件夹中的所有文件,以列表的形式返回

# 创建进程池
    po = multiprocessing.Pool(5)

# 向进程池中添加copy文件的任务
    for file_name in file_names:
        po.apply_async(copy_file, args=(file_name, folder_name, new_folder_name))
        count += 1
# 复制原文件中的文件
    print("-----start-----")
    po.close()  # 关闭进程池,关闭后进程池将不再接收请求
    po.join()  # 等待所有子进程执行完毕,且必须在close()后面
    print("一共复制%d个文件." % count)
    print("-----end-----")

if __name__ == "__main__":
    main()

上面的内容是两种多任务方式实现文件复制的方法。欢迎指正,多多学习。

你可能感兴趣的:(python)