当需要进行大量的IO操作时,使用线程池是提高系统效率的常用方法。Python线程池可以允许多个线程同时执行,避免了频繁的线程创建和销毁,提高了程序效率。本文将详细讲解Python线程池的正确使用方法,并提供两个示例说明。
一、Python线程池的安装
安装Python线程池,可以使用Python的内置模块concurrent.futures,它提供了ThreadPoolExecutor和ProcessPoolExecutor两种线程池实现方式。具体安装方法如下:
pip install concurrent.futures
二、Python线程池的使用方法
1. 创建线程池
使用ThreadPoolExecutor创建线程池,需要指定线程池中的线程数,示例代码如下:
from concurrent.futures import ThreadPoolExecutor
executor = ThreadPoolExecutor(max_workers=10)
该示例代码创建了一个最大线程数为10的线程池。
2. 添加任务到线程池
使用submit函数添加任务到线程池,submit函数的返回值是Future对象,可以用于获取任务的执行结果或者取消正在执行的任务。示例代码如下:
future = executor.submit(func, *args, **kwargs)
3. 获取任务执行结果
使用Future对象获取任务的执行结果,Future对象的result方法会阻塞当前线程,直到任务执行完毕并返回结果,否则会一直等待。示例代码如下:
result = future.result()
4. 取消正在执行的任务
如果需要停止正在执行的任务,可以使用Future对象的cancel方法取消正在执行的任务,示例代码如下:
future.cancel()
5. 关闭线程池
使用shutdown方法关闭线程池,该方法会先等待所有已经提交的任务执行完毕,然后停止所有的线程。示例代码如下:
executor.shutdown(wait=True)
三、Python线程池的示例说明
下面提供两个Python线程池的使用示例:
示例1:下载多张图片
from concurrent.futures import ThreadPoolExecutor
import requests
def download_image(url):
response=requests.get(url)
with open('{}.png'.format(url.split('/')[-1]),'wb') as f:
f.write(response.content)
print('{}下载完成'.format(url))
urls = ['https://www.python.org/static/apple-touch-icon-72x72-precomposed.png',
'https://www.python.org/static/apple-touch-icon-120x120-precomposed.png',
'https://www.python.org/static/apple-touch-icon-152x152-precomposed.png']
executor = ThreadPoolExecutor(max_workers=3)
for url in urls:
task = executor.submit(download_image, url)
executor.shutdown(wait=True)
该示例的功能是从3个url地址中下载对应的图片,使用了线程池的方式进行下载,其中max_workers设置为3,即限制了同时下载的线程数为3。
示例2:计算十万个数的阶乘
from concurrent.futures import ThreadPoolExecutor
import math
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n-1)
executor = ThreadPoolExecutor(max_workers=10)
results = []
for i in range(100000):
results.append(executor.submit(factorial, i))
executor.shutdown(wait=True)
for future in results:
result = future.result()
print('阶乘结果:{}'.format(result))
该示例的功能是计算从0到99999的数的阶乘,使用线程池的方式进行计算。其中max_workers设置为10,即限制了同时计算的线程数为10。
本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!