进程池与线程池
进程和线程能否无限制创建 答案:不可以
因为硬件发展赶不上软件,物理条件有限 如果我们在编写代码中
不断开启线程和进程 会导致 计算机崩溃
什么是池:
降低了程序的执行效率 但是保证了计算机硬件的安全
进程池
提前创建号固定数量的进程供后续程序调用 超过则等待
线程池
提前创建好固定数量的线程供后续程序调用 超出则等待
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 最大进程数量8
def task(n):
print('running', n)
time.sleep(random.randint(1, 3))
print('over', n)
# pool.submit(task, 'moon')
朝池子内提交任务 这是异步操作哦
if __name__ == '__main__':
for i in range(29):
pool.submit(task,i)
# 向池子里提交任务执行
'''
池子最大进程数 或 线程数 可以同步进行 多出来待处理的任务需要等待
池子一共就这几个位置,哪个执行完了哪个走 哪个位置空了任务就补上
'''
如何获取任务返回值
'''
如何获得异步任务的返回值
'''
这样每执行一个任务获得一个返回值 会导致任务变成串行 降低效率
if __name__ == '__main__':
for i in range(20):
res = pool.submit(task,i)
print(res.result())
# res.result() 可以获得任务池的返回值 接收返回值 把程序变成了串行
# 每个任务进行完 获得返回值后才会执行下一个任务
'''
如何一次性获得所有返回值
'''
t_list = []
# 定义一个空列表
if __name__ == '__main__':
for i in range(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 in range(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 in range(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(函数名)
# 任务回调机制,当这个任务执行完触发回调,执行回调括号内的内容