进程池与线程池

一:进程池与线程池

1.什么是池?
在保证计算机硬件不奔溃的前提下开设多进程和多线程
降低了程序的运行效率但是保证了计算机硬件的安全

image

2.什么是用池?
池的功能是限制启动的进程数或线程数。
3.什么时候应该限制?
当并发的任务数远远超过了计算机的承受能力时,即无法一次性开启过多的进程数或线程数时
就应该用池的概念将开启的进程数或线程数限制在计算机可承受的范围内
4.进程池与线程池
进程池:提前开设了固定个数的进程 之后反复调用这些进程完成工作(后续不再开设新的)
线程池:提前开设了固定个数的线程 之后反复调用这些线程完成工作(后续不再开设新的)
  • 进程池与线程池相结合使用,可以完美解决所缺的问题
5.进程池模块
from concurrent.futures import ProcessPoolExecutor
6.线程池模块
from concurrent.futures import ThreadPoolExecutor

二:进程池代码实现

ProcessPoolExecutor(1)	: 开设进程池去执行  设置进程池大小
submit(函数, 参数)		: 把任务提交到进程池执行
import time
import os

import random
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
# 							进程池				线程池

def task(n):
    # 进程id
    print(os.getpid(), '开始执行了')
    time.sleep(3)
    return n * n

if __name__ == '__main__':
    # 开设进程池去执行  设置进程池大小
    # ProcesspoolExecutor实列化得到一个对象
    # 括号内可以传数字 不传的话默认会开设当前计算机cpu个数五倍
    pool_p = ProcessPoolExecutor(1)

    for i in range(10):
        # 把任务提交到进程池执行
        #            函数(n=i) 指定参数
        pool_p.submit(task, n=i)
   	print('我是主进程')

image

2.进程池 进阶版
shutdown()	: 进程池内,等待所有子进程结束才执行主进程
import time
import os
import random
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
# 							进程池				线程池
def task(n):
    # 进程id
    print(os.getpid(), '开始执行了')
    time.sleep(1)
    return n * n

if __name__ == '__main__':
    # 开设进程池去执行  设置进程池大小
    # ProcesspoolExecutor实列化得到一个对象
    pool_p = ProcessPoolExecutor(3)

    for i in range(10):
        # 把任务提交到进程池执行
        #            函数(n=i) 指定参数
        pool_p.submit(task, n=i)
    # 等待所有子进程执行完成,主进程在执行 默认为True
    pool_p.shutdown()
    print('我是主进程')

image

3.进程池 中阶版
result() 	: 获取执行结果
import time
import os
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
# 							进程池				线程池
def task(n):
    # 进程id
    print(os.getpid(), '开始执行了')
    time.sleep(1)
    return n * n

if __name__ == '__main__':
    # 开设进程池去执行  设置进程池大小
    # ProcesspoolExecutor实列化得到一个对象
    pool_p = ProcessPoolExecutor(5)
    # 定义空列表
    ll = []
    for i in range(10):
        # 把任务提交到进程池执行
        #            函数(n=i) 指定参数
        f = pool_p.submit(task, n=i)
        # 将返回值添加到列表
        ll.append(f)
    # 等待所有子进程执行完成,主进程在执行
    pool_p.shutdown()
    for l in ll:
        # 取到当前进程执行任务的返回值
        res = l.result()
        print(res)
    print('我是主进程')

image

4.进程池 完整版
map取代
import time
import os
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
# 							进程池				线程池
def task(n):
    # 进程id
    print(os.getpid(), '开始执行了')
    time.sleep(1)
    return n * n
if __name__ == '__main__':
    # 开设进程池去执行  设置进程池大小
    # ProcesspoolExecutor实列化得到一个对象
    pool_p = ProcessPoolExecutor(3)

    # for i in range(10):
    # # 把任务提交到进程池执行
    # # 函数(n=i) 指定参数
    # f = pool_p.submit(task, n=i)

    # 等同于上面两句执行结果
    # map取代了for循环的,第一个参数是要执行的任务,第二个参数是可迭代对象
    # 迭代一次的结果,会传给任务
    pool_p.map(task, range(10))
    # 等待所有子进程执行完成,主进程在执行
    pool_p.shutdown()

    print('我是主进程')

image

5.进程池 终极版
add_done_callback   result回调
import time
import os
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
# 							进程池				线程池
def task(n):
    # 进程id
    print(os.getpid(), '开始执行了')
    # 执行任务处于就绪态,cpu调度谁就不一定了
    time.sleep(1)
    return n * n

def callback(result):
    print(result.result())

if __name__ == '__main__':
    # 开设进程池去执行  设置进程池大小
    # ProcesspoolExecutor实列化得到一个对象
    pool_p = ProcessPoolExecutor(1)
    for i in range(10):
        #  当任务执行完成后         会回调该函数(callback)
        pool_p.submit(task, n=i).add_done_callback(callback)

    # 等待所有子进程执行完成,主进程在执行
    pool_p.shutdown()
    print('我是主进程')

image

  • 输出结果
    image

三:线程池 使用

线程池与进程池用法模块相同,只更改设置线程池模块
import time
import os

import random
from concurrent.futures import ThreadPoolExecutor
# 							进程池				线程池

def task(n):
    # 进程id
    print(os.getpid(), '开始执行了')
    time.sleep(3)
    return n * n

if __name__ == '__main__':
    # 开设进程池去执行  设置进程池大小
    # ProcesspoolExecutor实列化得到一个对象
    # 括号内可以传数字 不传的话默认会开设当前计算机cpu个数五倍
    pool_p = ThreadPoolExecutor(1)

    for i in range(10):
        # 把任务提交到进程池执行
        #            函数(n=i) 指定参数
        pool_p.submit(task, n=i)
    print('我是主进程')

image

posted @ 2022-01-17 22:27  AlexEvans  阅读(321)  评论(0编辑  收藏  举报