多任务可以说是多线程,多进程,即在同一时间可以完成多个任务。不管是在python开发过程中还是在其它开发过程中,多线程和多进程开发都是不可缺少的,这不仅仅可以大大提高软件的执行效率,更能方便工具资源的管理。就并发和并行来说,并发不属于多线/进程,并行属于多线/进程。本文,通过使用线程池和消息队列实现了多任务复制的功能以及复制完成百分比的输入。一起来看看如何实现的吧。
首先:
为了创建线程池和消息队列引入multiprocessing模块
为了遍历全部文件导入os模快
import multiprocessing
import os
然后:
对将要实现的功能进行分析
获取要拷贝的文件夹名字
创建一个新的文件夹
获取文件夹中所有待复制的文件
创建进程池
创建队列
复制原文件夹中的文件复制到新文件夹中去
最后: 根据我们前期的分析,逐步实现我们的代码,详细代码如下所示 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(" 拷贝的进度为:%.2f %%" % ((current_file / all_files) * 100), end="") if current_file >= all_files: break print() if __name__ == '__main__': main()