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、让多线程和多进程的编码接口一致。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM