Python线程池的概念涉及创建一个线程集合(即线程池),这些线程预先被初始化并保存在内存中,等待任务的分配和执行。使用线程池可以有效地管理和复用线程资源,提高程序的执行效率。以下是Python线程池相关的概念及其示例程序:
1. 线程池(ThreadPool)
线程池是一个管理线程的集合,它负责线程的创建、调度和销毁。线程池中的线程可以并行执行多个任务,从而提高程序的整体性能。
示例程序:使用concurrent.futures.ThreadPoolExecutor
创建线程池
import concurrent.futures
import time
def task(n):
print(f"开始执行任务 {n}")
time.sleep(2) # 模拟耗时操作
print(f"任务 {n} 执行完毕")
return n * n
if __name__ == "__main__":
# 创建一个包含3个线程的线程池
with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:
# 提交5个任务到线程池
futures = [executor.submit(task, i) for i in range(5)]
# 等待所有任务完成并获取结果
for future in concurrent.futures.as_completed(futures):
result = future.result()
print(f"任务结果:{result}")
2. 任务(Task)
任务是线程池中的执行单元,通常是一个可调用的对象(如函数)。任务被提交到线程池后,线程池中的线程会竞争执行任务。
示例程序:定义并提交任务到线程池
import concurrent.futures
import time
def task(n):
print(f"执行任务 {n} 在线程 {threading.current_thread().name}")
time.sleep(n) # 模拟不同耗时的任务
return n * n
if __name__ == "__main__":
with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:
# 提交任务到线程池
future1 = executor.submit(task, 2)
future2 = executor.submit(task, 3)
# 获取任务结果
result1 = future1.result()
result2 = future2.result()
print(f"任务1结果:{result1}")
print(f"任务2结果:{result2}")
3. Future对象
Future对象表示线程池中的一个异步计算的结果。当任务被提交到线程池时,会返回一个Future对象,通过Future对象可以获取任务的状态、结果或异常。
示例程序:使用Future对象获取任务结果
import concurrent.futures
import time
def task(n):
time.sleep(n)
return n * n
if __name__ == "__main__":
with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor:
# 提交任务并获取Future对象
future = executor.submit(task, 3)
# 判断任务是否完成
if not future.done():
print("任务还未完成")
# 等待任务完成并获取结果
result = future.result()
print(f"任务结果:{result}")
4. 线程池大小(Pool Size)
线程池大小指的是线程池中线程的数量。线程池的大小应该根据系统的性能、任务的类型以及任务的并发量来合理设置。过小的线程池可能导致任务执行缓慢,而过大的线程池则可能引发系统资源的过度消耗。
示例程序:设置不同大小的线程池
import concurrent.futures
import time
def task(n):
print(f"执行任务 {n} 在线程 {threading.current_thread().name}")
time.sleep(2)
return n * n
if __name__ == "__main__":
# 设置不同大小的线程池
for pool_size in [1, 3, 5]:
with concurrent.futures.ThreadPoolExecutor(max_workers=pool_size) as executor:
futures = [executor.submit(task, i) for i in range(pool_size * 2)]
# 等待所有任务完成
concurrent.futures.wait(futures)
print(f"线程池大小为 {pool_size} 的任务已执行完毕")
time.sleep(1)
标签:__,Python,futures,print,concurrent,任务,线程,集合
From: https://blog.csdn.net/weixin_67244432/article/details/137395188