使用python完成多任务复制

多任务可以说是多线程,多进程,即在同一时间可以完成多个任务。不管是在python开发过程中还是在其它开发过程中,多线程和多进程开发都是不可缺少的,这不仅仅可以大大提高软件的执行效率,更能方便工具资源的管理。就并发和并行来说,并发不属于多线/进程,并行属于多线/进程。本文,通过使用线程池和消息队列实现了多任务复制的功能以及复制完成百分比的输入。一起来看看如何实现的吧。

首先: 为了创建线程池和消息队列引入multiprocessing模块 为了遍历全部文件导入os模块

	import multiprocessing
	import os
复制代码

然后: 对将要实现的功能进行分析

	1.获取要拷贝的文件夹名字
	2.创建一个新的文件夹
	3.获取文件夹中所有待复制的文件
	4.创建进程池
	5.创建队列
	6.复制原文件夹中的文件复制到新文件夹中去
复制代码

最后: 根据我们前期的分析,逐步实现我们的代码,详细代码如下所示

import os
import multiprocessing


def copy_file(queue, filename, old_folder_name, new_folder_name):
    # 以二进制形式打开文件
    data = open(old_folder_name + "/" + filename, "rb")
    # 读取文件
    temp = data.read()
    data.close()

    # 新建文件,写入源文件内容
    new_data = open(new_folder_name + "/" + filename, "wb")
    new_data.write(temp)
    new_data.close()
    # 如果拷贝完一个文件就向队列里写一个消息,表示已经完成
    queue.put(filename)


def main():
    # 1.获取要拷贝的文件夹的名字
    old_folder_name = input("请输入要拷贝的文件夹的名字:")
    # 2.创建一个新的文件夹(文件存在就pass,不存在就创建)
    try:
        new_folder_name = "D:\demo"
        os.mkdir(new_folder_name)
    except:
        pass
    # 3.获取文件夹中所有的待copy的文件  os.listdir()
    file_names = os.listdir(old_folder_name)
    print(file_names)
    # 4.创建进程池,多任务执行复制操作
    po = multiprocessing.Pool(3)
    # 5.创建队列
    queue = multiprocessing.Manager().Queue()
    # 6.复制原文件夹中的文件到新的文件夹中
    for i in file_names:
        # print("要拷贝的文件:%s" % i)
        po.apply_async(copy_file, args=(queue, i, old_folder_name, new_folder_name))
    po.close()
    # 获取所有文件的个数
    all_files = len(file_names)
    # 当前已完成文件个数
    current_file = 0
    while True:
        data = queue.get()
        # print("已经完成:%s 文件的拷贝" % data)   # 由于后面已经实现了复制完成的百分比,这里注释了
        current_file += 1
        print("\r拷贝的进度为:%.2f %%" % ((current_file / all_files) * 100), end="")
        if current_file >= all_files:
            break
    print()


if __name__ == '__main__':
    main()

复制代码

特别提示:文中需要输入的文件夹名字需要是在python项目下同一包下的文件名。创建的文件夹已经指定创建目录,读者可以根据自身情况进行相应更改。对本文如果有疑惑或者有问题,可以通过下方留言的方式进行提问或补充,当然也欢迎添加本人QQ:1415754221(记得注明来源哦!)大家一起共同学习!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值