进程池和线程池

(一)什么是池

  • 无论是开设进程还是开设线程,都需要消耗资源

  • 只不过开设线程消耗的资源比开设进程消耗的资源要少一些

  • 硬件的开发速度远远跟不上软件的开发速度

  • 我们的宗旨是保证计算机硬件正常工作的情况下最大限度的利用计算机

    • 池是用来保证计算机硬件安全的情况下最大限度的利用计算机
    • 池降低了程序的运行效率,但是保证了计算机硬件的安全,从而保证程序的正常运行

(二)线程池

  • from concurrent.futures import ThreadPoolExecutor 线程池的模块
  • pool=ThreadPoolExecutor() 创建线程
    • 线程中可以加入参数规定线程的个数
    • 默认为空时,线程的个数就是cpu个数的五倍
  • 提交线程池的任务时,会有返回值
  • 如果需要在获取返回值之前获取线程中执行的数据,就需要加入一个pool.shutdow()
  • pool.shutdow()关闭线程池,并且等待线程池中的任务执行完毕
# 导入模块
import time
from  concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor

# 创建池子
# 线程池ThreadPoolExecutor()可带参数数字
# 如果参数默认为空的话  池子的大小就是cpu的个数的五倍
# 此时池子内是5,则创建的线程个数为5,不会额外的创建其他线程或销毁这些线程
# 从而节省了资源
pool=ThreadPoolExecutor(5)
"""
    池子的使用
        只需要将需要做的任务提交到池子中,自动会有人来接应你
"""
def task(n):
    print(n)
    time.sleep(2)
    return n**2
# 朝线程池中添加任务
# submit是一个异步提交
# pool.submit(task,1)
# print("主")
# # 1
# # 主

p_list=[]
# 朝线程池中提交十九个任务
for i in range(1,20):
    res=pool.submit(task,i)
    # submit是有返回值的
    # 返回值就是执行的线程任务的返回值

    # print(res.result())# 这一步获取返回值由并行变成了串行,如果想要变成并行就需要跟join方法一样的操作
    # 将返回的数据添加进空列表中
    p_list.append(res)

"""
    如果是想先获取到执行的任务,最后获取返回值时,
    需要加入一个pool.shutdown()  关闭池子,等待池子中的任务执行完毕
"""
# 遍历列表获取每一个返回值
pool.shutdown()# 关闭池子,等待池子中的任务执行完毕
for p in p_list:
    print(p.result())

(三)进程池

  • 创建进程池pool=ProcessPoolExecutor()
  • pool=ProcessPoolExecutor() 可以写入参数
    • 参数默认为空的时候,代表可以创建的进程个数就是当前cpu的个数
    • 默认参数为数字时,数字是几,就有几个进程
  • 指定的进程个数不会新创建,也不会销毁,始终就是这几个
  • pool.shutdown() 关闭进程池,等待进程执行完毕
  • 提交的进程也存在返回值
# 导入模块
import os
import time
from  concurrent.futures import ProcessPoolExecutor

# 创建进程池
pool=ProcessPoolExecutor(5)
# 参数默认为5个,这五个进程的进程号,不会改变
"""
    进程池pool=ProcessPoolExecutor()
    同样也可以写入参数,默认为空的时候进程的个数就是你cpu的个数
    写入的参数是几,则可以创建几个进程
"""


def task(n):
    print(n,f"{os.getpid()}")
    time.sleep(2)
    return n**2


def main():
    p_list=[]
    # 创建19个进程
    for i in range(1, 20):
        # 创建的进程也是由返回值的
        res=pool.submit(task, i)
        # print(res.result()) # 这一步会让异步并发的进程变成串行的
        p_list.append(res)
    pool.shutdown()# 关闭进程池,等待进程全部执行完毕
    # 获取所有的返回结果
    for p in p_list:
        print(p.result())




if __name__ == '__main__':
    main()
  • 异步回调机制
  • 给每一个异步提交任务绑定一个方法,一旦任务有结果了就会自动的触发方法
  • res=pool.submit(task,i).add_done_callback(call_back)
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor

# 创建进程吃对象
pool=ProcessPoolExecutor()

def task(n):
    print(n)
    return n**2

# 此时的参数n 是future的对象
def call_back(n):
    # future对象.result()方法获取到结果
    print(n.result())
if __name__ == '__main__':
    for i in range(20):
        # 异步回调机制方法
        res=pool.submit(task,i).add_done_callback(call_back)
posted @   苏苏!!  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示