import multiprocessing
import os
# copy文件函数
def copy_file(old_folder_name, new_folder_name, file_name):
print('copy文件夹{}====》到{},文件名称为:{}'.format(old_folder_name, new_folder_name, file_name))
# 读取文件
with open(old_folder_name + '/' + file_name, 'rb') as fw:
file_content = fw.read()
# 写入文件
with open(new_folder_name + '/' + file_name, 'wb') as fr:
fr.write(file_content)
def main():
# 1. 获取用户要copy的文件夹名称
# global new_folder_name
old_folder_name = input('请输入要copy的文件夹名称: ')
if not os.path.exists(old_folder_name):
old_folder_name = input('文件夹不存在,请重新输入: ')
# 2. 创建一个新的文件夹
# if not os.path.exists(old_folder_name + '[复制]'):
# 如果文件夹存在,则抛出异常
try:
new_folder_name = old_folder_name + '[复制]'
os.mkdir(new_folder_name)
except:
pass
# 3. 获取文件夹所有的待copy的文件名称 listdir()
file_names = os.listdir(old_folder_name)
print(file_names)
# 4. 赋值文件夹中的文件,到新的文件夹中
pool = multiprocessing.Pool(5)
for file_name in file_names:
# 取出进程池中一个进程执行copy文件操作,当空闲进程使用光后,从使用过的进程(alive活跃的)中取一个年龄做大(且进程执行完毕)的进程,重复使用。
pool.apply_async(copy_file, args=(old_folder_name, new_folder_name, file_name))
# 这两个必须写否则进程池里的进程不会运行
pool.close()
pool.join()
if __name__ == "__main__":
main()
需要注意的是主进程不会等待进程池中程序运行完毕,它会直接运行完主进程程序,主进程程序运行完毕,那么程序就结束了,所以要加入pool.close()结束进程池,让进程池中进程开始运行,pool.join()使主进程等待pool中所有子进程执行完成,必须放在close语句之后