并发编程之线程池,进程池
一.为什么引入池的概念,什么是池
池
受限于硬件的发展,硬件跟不上软件的发展
在保证计算机硬件安全的情况下,最大限度的利用了计算机
池其实是降低了程序的运行效率,但是保证了计算机硬件的安全
我们再使用进程和线程时,不可能无限制的去开进程或线程。因此我们需要用到进程池,线程池来解决这一问题。
二.Python模块-----concurrent.futures 模块(并发未来)
1.concurrent模块是用来创建并行的任务,提供了更高级别的接口
2.模块导入进程池 与 线程池
from concurrent.futures import ProcessPoolExecutor 进程池
from concurrent.futures import ThreadPoolExecutor 线程池
3.p = ProcessPoolExecutor(max_works) 对于进程池 如果不写max_works 默认是CPU数目
p= ThreadPoolExecutor(max_works) 对于线程池 如果不写max_works 默认是CPU数目*5
4.p.submit(task,i)是异步提交 task 是函数 i 是 task所需的参数
obj = p.submit(task,i) 返回的是一个对象obj
obj.result()是函数返回的结果
p.shutdown() 关闭池子 相当于 close join
三.线程池,进程池
基于concurrent模块的线程池与进程池

1 from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor 2 import time 3 4 def task(n): 5 print(n) 6 time.sleep(2) 7 return n+1 8 9 def call_back(n): 10 print('结果是:',n.result()) 11 12 if __name__ == '__main__': 13 start = time.time() 14 pool = ThreadPoolExecutor(5) 15 #pool = ProcessPoolExecutor(5) 16 for i in range(7): 17 res = pool.submit(task,i).result() 18 print(res) 19 20 pool.shutdown() 21 22 print(time.time()-start) 23 #14.00873589515686

from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor import time def task(n): print(n) time.sleep(2) return n+1 def call_back(n): print('结果是:',n.result()) if __name__ == '__main__': start = time.time() pool = ThreadPoolExecutor(5) #pool = ProcessPoolExecutor(5) for i in range(7): res = pool.submit(task,i) p_list.append(res) pool.shutdown() for p in p_list: print('>>>:',p.result()) print(time.time()-start) # 4.002536296844482
使用回调函数实现异步

from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor import time def task(n): print(n) time.sleep(2) return n+1 def call_back(n): print('结果是:',n.result()) if __name__ == '__main__': start = time.time() pool = ThreadPoolExecutor(5) #pool = ProcessPoolExecutor(5) for i in range(7): res = pool.submit(task,i).add_done_callback(call_back) #异步 pool.shutdown() print(time.time()-start) # 4.002536296844482
万般皆下品,唯有读书高!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)