进程和线程能否无限制创建 答案:不可以
因为硬件发展赶不上软件,物理条件有限 如果我们在编写代码中
不断开启线程和进程 会导致 计算机崩溃
什么是池:
降低了程序的执行效率 但是保证了计算机硬件的安全
进程池
提前创建号固定数量的进程供后续程序调用 超过则等待
线程池
提前创建好固定数量的线程供后续程序调用 超出则等待
from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
import os, time, random
from threading import current_thread
# pool = ThreadPoolExecutor(20)# 创建一个进程池ThreadPoolExecutor 不传默认开设CPU的5倍线程# 也可以在括号里面填数字 手动控制最大线程数
pool = ProcessPoolExecutor(8)# 创建一个进程池ProcessPool 最大进程数量8deftask(n):print('running', n)
time.sleep(random.randint(1,3))print('over', n)# pool.submit(task, 'moon')
朝池子内提交任务 这是异步操作哦
if __name__ =='__main__':for i inrange(29):
pool.submit(task,i)# 向池子里提交任务执行'''
池子最大进程数 或 线程数 可以同步进行 多出来待处理的任务需要等待
池子一共就这几个位置,哪个执行完了哪个走 哪个位置空了任务就补上
'''
如何获取任务返回值
'''
如何获得异步任务的返回值
'''
这样每执行一个任务获得一个返回值 会导致任务变成串行 降低效率
if __name__ =='__main__':for i inrange(20):
res = pool.submit(task,i)print(res.result())# res.result() 可以获得任务池的返回值 接收返回值 把程序变成了串行# 每个任务进行完 获得返回值后才会执行下一个任务'''
如何一次性获得所有返回值
'''
t_list =[]# 定义一个空列表if __name__ =='__main__':for i inrange(20):
res = pool.submit(task, i)
t_list.append(res)# 把获取到的所有返回值存入列表for t in t_list:print(t.result())# 这样就可以高效率 ,任务全部提交 然后根据列表中的数据来获得返回值# 不会耽误进程池里面的任务执行# 列表内返回值是有序的 根据任务执行的先后顺序
pool.shutdown()# 关闭线程池 等待线程池里面的所有任务执行完毕才会关闭if __name__ =='__main__':for i inrange(20):
res = pool.submit(task, i)
t_list.append(res)
pool.shutdown()for t in t_list:print(t.result())'''
这样配合使用 可以先执行完所有任务 ,然后在一次打印所有返回值
'''
回调机制
if __name__ =='__main__':for i inrange(20):
res = pool.submit(task, i)print(res.result())# 获取任务返回值
res = pool.submit(task, i).add_done_callback(函数名)# 当这个任务产生返回值后,立刻触发回调机制 执行回调机制需要执行的内容.add_done_callback
# 异步回掉机制
当任务执行完会出发,可回调数据 方法等
总结
from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
# 线程池与进程池的模块
pool = ProcessPoolExecutor(8)
pool = ThreadPoolExecutor(20)# 生成一个线程池或进程池对象并设定最大数.submit
pool.submit(提交任务,行参)# 向任务池提交任务.result()
res = pool.submit(task, i)
res.result()# 使用一个变量接收任务返回值 并 解析任务返回值获得真实内容.add_done_callback
pool.submit(task, i).add_done_callback(函数名)# 任务回调机制,当这个任务执行完触发回调,执行回调括号内的内容
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了