• python3 进程池Pool


    进程池的概念,定义一个池子,在里面放上固定数量的进程,有需求来了,就拿一个池中的进程来处理任务,等到处理完毕,进程并不关闭,而是将进程再放回进程池中继续等待任务。如果有很多任务需要执行,池中的进程数量不够,任务就要等待之前的进程执行任务完毕归来,拿到空闲进程才能继续执行。也就是说,池中进程的数量是固定的,那么同一时间最多有固定数量的进程在运行。这样不会增加操作系统的调度难度,还节省了开闭进程的时间,也一定程度上能够实现并发效果

    进程池无IO堵塞的情况

    # -*- coding: utf-8 -*-
    import os
    from multiprocessing import Pool
    
    
    def func(n):
        return n**2
    
    
    if __name__ == '__main__':
        pool = Pool()
        obj_lst = []
        for i in range(6):
            p_obj = pool.apply_async(func, args=(i,))  # 异步执行进程
            obj_lst.append(p_obj)
        pool.close()  # 不再向进程池提交新的任务了
        pool.join()  # 进程池中的进程都执行完了
        print([p_obj.get() for p_obj in obj_lst])
    
    
    # [0, 1, 4, 9, 16, 25]

     

    # coding:utf-8
    import time
    from multiprocessing import Process, Pool
    
    
    def func(n):
        pass
    
    
    if __name__ == '__main__':
        num = 10
        start_pool_time = time.time()
        pool = Pool(5)
        pool.map(func, range(num))  # map是异步执行的,并且自带close和join
        print("通过进程池执行的时间:", time.time() - start_pool_time)
    
        std_start_time = time.time()
        for i in range(num):
            pass
        print("正常执行的执行时间:", time.time() - std_start_time)
    
        pro_start_time = time.time()
        p_lst = []
        for i in range(num):
            p = Process(target=func, args=(i,))
            p.start()
            p_lst.append(p)
    
        [pp.join() for pp in p_lst]
        print("多进程的执行时间:", time.time() - pro_start_time)
    
    # 通过进程池执行的时间: 0.46875
    # 正常执行的执行时间: 0.0
    # 多进程的执行时间: 0.828125
    
    #一般约定俗成的是进程池中的进程数量为CPU的数量,工作中要看具体情况来考量。

     

    有IO阻塞的情况

    # coding:utf-8
    import time
    from multiprocessing import Process, Pool
    
    
    def func(n):
        time.sleep(1)
    
    
    if __name__ == '__main__':
        num = 10
        start_pool_time = time.time()
        pool = Pool(5)
        pool.map(func, range(num))
        print("通过进程池执行的时间:", time.time() - start_pool_time)
    
        std_start_time = time.time()
        for i in range(num):
            time.sleep(1)
        print("正常执行的执行时间:", time.time() - std_start_time)
    
        pro_start_time = time.time()
        p_lst = []
        for i in range(num):
            p = Process(target=func, args=(i,))
            p.start()
            p_lst.append(p)
    
        [pp.join() for pp in p_lst]
        print("多进程的执行时间:", time.time() - pro_start_time)
    
    
    # 通过进程池执行的时间: 2.578125
    # 正常执行的执行时间: 10.0
    # 多进程的执行时间: 1.75

     

    从Python3.2开始,标准库为我们提供了concurrent.futures模块,它提供了ThreadPoolExecutor和ProcessPoolExecutor两个类,实现了对threading和multiprocessing的进一步抽象(这里主要关注线程池),不仅可以帮我们自动调度线程,还可以做到:

    1、主线程可以获取某一个线程(或者任务的)的状态,以及返回值。

    2、当一个线程完成的时候,主线程能够立即知道。

    3、让多线程和多进程的编码接口一致。

  • 相关阅读:
    1003 Dijkstra算法
    微信公众号签名错误(invalid signature)的问题排查
    使用OpenSSL(Windows x64版)将pem格式证书转换为p12格式
    单篇文章JS模拟分页
    自制Javascript分页插件,支持AJAX加载和URL带参跳转两种初始化方式,可用于同一页面的多个分页和不同页面的调用
    仿写Windows7桌面和任务栏 HTML5+CSS3+Jquery实现
    【转载】ASP.NET线程安全与静态变量的生命周期浅谈
    ASP.NET 多线程 监控任务执行情况,并显示进度条
    再谈Cookies欺骗
    Cookies欺骗分析与防护
  • 原文地址:https://www.cnblogs.com/lilyxiaoyy/p/10986358.html
Copyright © 2020-2023  润新知