进程池与线程池

进程池与线程池

进程和线程能否无限制创建  答案:不可以
因为硬件发展赶不上软件,物理条件有限 如果我们在编写代码中
不断开启线程和进程 会导致 计算机崩溃

什么是池:
	降低了程序的执行效率  但是保证了计算机硬件的安全

进程池
	提前创建号固定数量的进程供后续程序调用  超过则等待

线程池
	提前创建好固定数量的线程供后续程序调用  超出则等待
  
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(函数名)
# 任务回调机制,当这个任务执行完触发回调,执行回调括号内的内容
posted @   Python-moon  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示