python基础——池

池的介绍:

提前创建进程池,防止创建的进程数量过多导致系统性能受到影响,在系统执行任务时,系统会使用池中已经创建进程/线程,从而防止资源的浪费,创建的进程/线程可以让多个进程使用,从而降低了操作系统的负担,加快了系统执行的效率;

若果不创建进程池,可能会导致任务建立的进程数量过多,影响系统,并且在执行不同任务时,还会重新进行进程的创建,导致资源的浪费

池的使用:

进程池:

ProcessPoolExecutor

进程池的使用:
python 复制代码
from threading import current_thread
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
def func(i):
    print("进程号:{}\n".format(current_thread().ident))
    print("进程{}\n".format(i))

tp = ThreadPoolExecutor(4)
ts = ProcessPoolExecutor(10)
if __name__ == '__main__':
    for i in range(100):
        tp.submit(func,i)

运行结果:

由于此时池中创建了四个进程,因此函数func()在执行多次的过程中会循环的使用四个已经创建的进程(如上图)

不使用进程池:
python 复制代码
from threading import current_thread
from multiprocessing import Process

def func(i):
    print("进程号:{}".format(current_thread().ident))
    print("进程{}".format(i))

if __name__ == '__main__':
    for i in range(10):
        t = Process(target=func,args=(i,)).start()

运行结果:

两者对比可以看到,由于后者未使用进程池,因此,在func()函数执行了10次时,系统创建了十个进程,而前者使用了建立了四个进程的进程池,因此,即使func()函数执行了100次,系统也只创建了4个进程

线程池:

不使用线程池:

python 复制代码
from threading import current_thread
from threading import Thread

def func(i):
    print("线程号:{}".format(current_thread().ident))
if __name__ == '__main__':
    for i in range(10):
        t = Thread(target=func,args=(i,)).start()

运行结果:

有结果可以看到:使用线程运行了十次func()函数,系统创建了十个进程用来执行此任务

使用线程池:

python 复制代码
from threading import current_thread
from concurrent.futures import ThreadPoolExecutor

def func(i):
    print("线程号:{}".format(current_thread().ident))
if __name__ == '__main__':
    tp = ThreadPoolExecutor(20)
    for i in range(100):
        tp.submit(func,i)

运行结果:

执行100次,但是被使用的线程仅有创建的20个,节省了系统的资源

使用map()方法进行函数的传递

python 复制代码
from threading import current_thread
from concurrent.futures import ThreadPoolExecutor

def func(i):
    print("线程号:{}".format(current_thread().ident))
    print(i)
if __name__ == '__main__':
    tp = ThreadPoolExecutor(4)
    ret = tp.map(func,(i for i in range(10)))
    print(ret)

回调函数:

python 复制代码
from threading import current_thread
from concurrent.futures import ThreadPoolExecutor

def func(i):
    print("线程号:{}".format(current_thread().ident))
    print(i)
    return  i**2
def print_func(ret,i):
    print("我是print_func()函数")
    print(ret.result())

if __name__ == '__main__':
    tp = ThreadPoolExecutor(4)
    for i in range(20):
        ret = tp.submit(func,i)
        ret.add_done_callback(print_func)

运行结果:

使用回调函数可以保证ret对象在执行完毕之后立即执行回调函数的参数对象

进程创建数量的建议:

进程数量:建议进程数量为cpu数量的一倍 到cpu数量的二倍之间

线程数量:建议线程数量为cpu数量的五倍

相关推荐
爆肝疯学大模型4 分钟前
SQL server数据库实现远程跨服务器定时同步传输数据
运维·服务器·数据库
源码方舟10 分钟前
【基于ALS模型的教育视频推荐系统(Java实现)】
java·python·算法·音视频
萑澈21 分钟前
2025深圳杯D题法医物证多人身份鉴定问题四万字思路
python·数学建模
Ronin-Lotus24 分钟前
图像处理篇---MJPEG视频流处理
图像处理·python·opencv
luck_me535 分钟前
k8s v1.26 实战csi-nfs 部署
linux·docker·云原生·容器·kubernetes
不摆烂选手36 分钟前
Linux 阻塞和非阻塞 I/O 简明指南
linux·驱动开发·ubuntu·正点原子imx6ull学习笔记
溪饱鱼37 分钟前
第6章: SEO与交互指标
服务器·前端·microsoft
请你喝好果汁64142 分钟前
python_竞态条件
开发语言·python
正在走向自律44 分钟前
Python 数据分析与可视化:开启数据洞察之旅(5/10)
开发语言·人工智能·python·数据挖掘·数据分析
wanhengidc1 小时前
服务器中存储空间不足该怎么办?
运维·服务器·网络