python多任务之进程池copy文件夹中所有文件

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语句之后

其实:

for i in range(0, 10):
        # Pool().apply_async(要调用的目标,(传递给目标的参数元祖,))
        # 每次循环将会用空闲出来的子进程去调用目标
        # 如果池中的进程数已经达到指定的最大值,那么该请求就会等待,直到池中有进程结束,才会用之前的进程来执行新的任务
        po.apply_async(worker, (i,))

    print("----start----")
    po.close()  # 关闭进程池,关闭后po不再接收新的请求
    po.join()  # 等待po中所有子进程执行完成,必须放在close语句之后\

可以替换成一行代码:

# map(fun, iterable)
po.map(worker, range(10))

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值