多任务可以说是多线程,多进程,即在同一时间可以完成多个任务。不管是在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(记得注明来源哦!)大家一起共同学习!