由于我也是在学习python,说的不好的地方欢迎补充!!!要喷也轻一点
首先我们需要知道什么是内置池? 在python中内置池的种类有两种:一种是线程池,一种是进程池.
首先我们先来看线程池:
概念:线程池在系统启动时即创建大量空闲的线程,程序只要将一个函数提交给线程池,线程池就会启动一个空闲的线程来执行它。当该函数执行结束后,该线程并不会死亡,而是再次返回到线程池中变成空闲状态,等待执行下一个函数。
使用它的好处是什么呢?
使用线程池可以有效地控制系统中并发线程的数量。当系统中包含有大量的并发线程时,会导致系统性能急剧下降,甚至导致 Python 解释器崩溃,而线程池的最大线程数参数可以控制系统中并发线程的数量不超过此数。
import time #导入时间模块
from multiprocessing.pool import ThreadPool #导入内置线程池
def func1(): #创建任务一
time.sleep(2)
print('任务一完成')
def func2(*args,**kwargs): #创建任务二
time.sleep(2)
print('任务二完成',args,kwargs)
if __name__ == '__main__': #创建子线程
#线程池 可以同时开启3条线程 并且都是可重复使用
tp = ThreadPool(3)
#向池子提交任务
tp.apply_async(func1)
tp.apply_async(func2,args=(1,2),kwds={'a': 1,'b': 2})
tp.apply_async(func1)
tp.apply_async(func1)
tp.apply_async(func2, args=(1, 2), kwds={'a': 1, 'b': 2})
tp.apply_async(func1)
tp.close() #停止提交任务
tp.join() #等待现有任务执行完毕
那么进程池和线程池差不多,只是把模块导一下.细节调一下就好了.废话不多说,直接看代码好吧
import time
from multiprocessing.pool import Pool #导入内置进程池
def func1():
time.sleep(2)
print('任务一完成')
def func2(*args,**kwargs):
time.sleep(2)
print('任务二完成',args,kwargs)
if __name__ == '__main__':
#进程池 可以同时开启3条进程 并且都是可重复使用
tp = Pool(3)
#向池子提交任务
tp.apply_async(func1)
tp.apply_async(func2,args=(1,2),kwds={'a': 1,'b': 2})
tp.apply_async(func1)
tp.apply_async(func1)
tp.apply_async(func2, args=(1, 2), kwds={'a': 1, 'b': 2})
tp.apply_async(func1)
tp.close() #停止提交任务
tp.join() #等待现有任务执行完毕
可以看到这两份代码只有细节上有一定改变,大概内容是差不多的.那么进程池的概念是什么呢?
定义一个池子,在里面放上固定数量的进程,有需求来了,就拿一个池中的进程来处理任务,等到处理完毕,进程并不关闭,而是将进程再放回进程池中继续等待任务。如果有很多任务需要执行,池中的进程数量不够,任务就要等待之前的进程执行任务完毕归来,拿到空闲进程才能继续执行
那么就不难得知,池中进程的数量是固定的,那么同一时间最多有固定数量的进程在运行。这样不会增加操作系统的调度难度,还节省了开闭进程的时间,也一定程度上能够实现并发效果。
其实像这种python自带的东西,我们只需要知道怎么用就行,不用搞懂为什么是这样.不过后续本人会更新这个的原理,也就是线程的重复利用