Python线程池ThreadPool使用篇
本文将详细介绍Python中线程池ThreadPool的使用方法,包括线程池的创建、任务的提交、结果的获取、线程数设置等操作,同时提供两个示例说明 ThreadPool 的使用。
线程池ThreadPool简介
ThreadPool是Python实现线程池的一种方式,线程池是用来管理多线程的工具,通过维护一定数量的线程,可以有效地提高程序的性能,降低系统的开销。在Python中,使用ThreadPool可以避免手动管理线程的复杂度,从而更加方便地实现多线程程序。
创建ThreadPool
在Python中,使用ThreadPool可以通过ThreadPoolExecutor
类来实现,需要使用from concurrent.futures import ThreadPoolExecutor
语句来导入ThreadPoolExecutor类,在创建ThreadPool时需要传入线程数量(即线程池的大小),代码如下所示:
from concurrent.futures import ThreadPoolExecutor
thread_pool_size = 5 # 线程池大小
executor = ThreadPoolExecutor(max_workers=thread_pool_size)
提交任务
在创建了ThreadPoolExecutor后,就可以将任务提交到线程池中了,通过executor.submit()
方法可将目标函数提交给线程池,并返回一个Future
对象,代码如下:
def task_func(arg1, arg2):
# 定义一个计算函数,将arg1和arg2相乘
return arg1 * arg2
result_future = executor.submit(task_func, 2, 3)
submit()函数将指定的函数异步提交到线程池中,线程池会异步的执行该函数,并返回一个Future
对象,该对象可以用来获取结果或等待任务完成。
获取结果
如果需要获取任务执行的结果,可以使用Future.result()
函数,代码如下:
result = result_future.result()
print(result) # 输出6
在调用了Future.result()
函数后,程序将阻塞,等待任务执行完成并返回结果,如果任务执行过程中发生异常,则会抛出异常。
示例一
下面是一个示例,使用ThreadPoolExecutor来计算多个数的平方和:
from concurrent.futures import ThreadPoolExecutor
def square(num):
# 返回num的平方
return num*num
if __name__=="__main__":
data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
executor = ThreadPoolExecutor(max_workers=3) # 线程池大小
futures = []
for num in data:
futures.append(executor.submit(square, num))
result = sum([future.result() for future in futures])
print("Result: ", result)
在该示例中,首先定义了一个计算平方的函数square()
,然后定义了一个数据列表data
,其中包含了1至9的整数。在Main函数中,通过ThreadPoolExecutor
创建了一个大小为3的线程池,然后将每个数据提交到线程池中,得到了一个Future
对象的列表,通过sum()
函数将每个数据的平方相加,得到最终结果。
示例二
下面是一个示例,使用ThreadPoolExecutor异步下载多个图片并保存:
import requests
import os
from concurrent.futures import ThreadPoolExecutor
def download_img(url, img_name):
img = requests.get(url)
with open(img_name, "wb") as f:
f.write(img.content)
print(f"{img_name}下载完成")
if __name__=="__main__":
img_urls = [
"https://picsum.photos/200/300",
"https://picsum.photos/seed/picsum/200/300",
"https://picsum.photos/id/870/200/300",
"https://picsum.photos/id/237/200/300",
"https://picsum.photos/200/300/?blur",
"https://picsum.photos/id/1000/200/300",
"https://picsum.photos/id/1014/200/300"
]
img_names = ["img" + str(i) + ".jpg" for i in range(len(img_urls))]
executor = ThreadPoolExecutor(max_workers=3) # 线程池大小
futures = []
for i in range(len(img_urls)):
futures.append(executor.submit(download_img, img_urls[i], img_names[i]))
print("等待下载完成...")
for future in futures:
future.result()
print("所有图片下载完成!")
在该示例中,定义了一个下载图片的函数download_img()
,该函数接受一个URL参数以及一个存储位置参数。在Main函数中,首先定义了一组图片的URL列表和文件名列表,然后通过ThreadPoolExecutor
创建了一个大小为3的线程池,将每个URL及对应的文件名提交到线程池中,得到了一个Future
对象的列表,通过循环获取每个Future
对象的结果,等待所有的任务完成后输出下载完成的提示信息。
以上就是本文对Python线程池ThreadPool的使用详解以及两个示例。通过线程池的使用,可以让多线程编程更加简单、高效。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python线程池threadpool使用篇 - Python技术站