一、什么是线程池
系统启动一个新线程的成本是比较高的,因为它涉及与操作系统的交互。在这种情形下,使用线程池可以很好地提升性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池。
线程池在系统启动时即创建大量空闲的线程,程序只要将一个函数提交给线程池,线程池就会启动一个空闲的线程来执行它。当该函数执行结束后,该线程并不会死亡,而是再次返回到线程池中变成空闲状态,等待执行下一个函数。
此外,使用线程池可以有效地控制系统中并发线程的数量。当系统中包含有大量的并发线程时,会导致系统性能急剧下降,甚至导致 Python 解释器崩溃,而线程池的最大线程数参数可以控制系统中并发线程的数量不超过此数。
二、如何创建线程池
python里面创建线程池很简单,只需要简单几行代码即可
#实例化对象
pool=Pool(num)
#开启线程池,get_down为函数名且不加‘()’,list为一个可迭代对象
pool.map(get_down,list)
#关闭
pool.close()
pool.join()
三、单线程与线程池执行效率对比
1.单线程实例
#!/usr/bin/python
# # Created by 老刘 on 2020/5/11
from multiprocessing.dummy import Pool
import time
def get_down(list):
print("正在下载",list)
time.sleep(2)
print('下载完毕!')
if __name__ == "__main__":
#单线程
s = time.time()
list=[1,2,3,4]
for list in list:
get_down(list)
e=time.time()
print("共耗时:",e-s)
******************************
output:共耗时: 8.001622200012207
******************************
```
2.多线程实例
```python
from multiprocessing.dummy import Pool
import time
def get_down(list):
print("正在下载",list)
time.sleep(2)
print('下载完毕!')
if __name__ == "__main__":
start = time.time()
list=[1,2,3,4]
#实例化线程池
pool=Pool(4)
#开启线程池,get_down函数,list为可迭代对象
pool.map(get_down,list)
pool.close()
pool.join()
end=time.time()
print("共耗时:",end-start)
******************************
output:共耗时: 2.024726152420044
******************************
由两个实例不难看出,单线程耗时: 8.001622200012207秒,而线程池只需2.024726152420044秒,多线程明显可以提高执行效率。