网络编程中,使用多任务实现文件的复制是非常有必要的。下面将简要介绍两种基于多任务的文件复制实现方式。
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()
上面的内容是两种多任务方式实现文件复制的方法。欢迎指正,多多学习。