Python面试题: 如何在 Python 中实现一个线程池?
在 Python 中,实现线程池可以使用内置的 concurrent.futures
模块,该模块提供了一个高层次的接口来管理并发任务。ThreadPoolExecutor
类是实现线程池的主要工具。以下是一些使用示例,展示如何在 Python 中实现和使用线程池:
1. 基本使用
首先,创建一个线程池,并使用 submit
方法将任务提交给线程池:
from concurrent.futures import ThreadPoolExecutor, as_completed
import time
def task(n):
print(f"Task {n} is running")
time.sleep(2)
return f"Task {n} completed"
# 创建一个线程池,最大线程数为3
with ThreadPoolExecutor(max_workers=3) as executor:
# 提交多个任务
futures = [executor.submit(task, i) for i in range(5)]
# 等待任务完成并获取结果
for future in as_completed(futures):
print(future.result())
在这个示例中,线程池最多可以同时运行3个任务,所有5个任务会被提交到线程池,并通过 as_completed
函数等待它们的完成。
2. 使用 map
方法
ThreadPoolExecutor
提供了一个 map
方法,可以用来将一个函数应用到一个可迭代对象的每个元素上,类似于内置的 map
函数,但它会并行地执行任务:
from concurrent.futures import ThreadPoolExecutor
import time
def task(n):
print(f"Task {n} is running")
time.sleep(2)
return f"Task {n} completed"
# 创建一个线程池,最大线程数为3
with ThreadPoolExecutor(max_workers=3) as executor:
# 使用 map 方法并行执行任务
results = executor.map(task, range(5))
# 打印结果
for result in results:
print(result)
3. 处理异常
在提交任务时,如果任务中发生异常,ThreadPoolExecutor
可以捕获并处理这些异常:
from concurrent.futures import ThreadPoolExecutor
def task(n):
if n == 2:
raise ValueError("An error occurred in task 2")
return f"Task {n} completed"
# 创建一个线程池
with ThreadPoolExecutor(max_workers=3) as executor:
futures = [executor.submit(task, i) for i in range(5)]
for future in as_completed(futures):
try:
result = future.result()
except Exception as e:
print(f"Task raised an exception: {e}")
else:
print(result)
4. 使用 shutdown
方法
线程池可以使用 shutdown
方法来显式关闭。在 with
语句块中使用 ThreadPoolExecutor
时,它会自动调用 shutdown
方法,但你也可以显式调用它:
from concurrent.futures import ThreadPoolExecutor
def task(n):
print(f"Task {n} is running")
return f"Task {n} completed"
# 创建一个线程池
executor = ThreadPoolExecutor(max_workers=3)
futures = [executor.submit(task, i) for i in range(5)]
# 等待所有任务完成
for future in as_completed(futures):
print(future.result())
# 显式关闭线程池
executor.shutdown()
这些示例展示了如何在 Python 中使用 ThreadPoolExecutor
来创建和管理线程池。ThreadPoolExecutor
提供了一种简单且有效的方法来处理并发任务,使代码更加简洁和易于维护。
原文地址:https://blog.csdn.net/bigorsmallorlarge/article/details/140304403
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!