Python线程池

线程池介绍

Python3 中标准线程池实现位于:concurrent.futures.thread.ThreadPoolExecutor,它于 Python 3.2 引入,目的是:

  • 统一线程 / 进程并发模型
  • 屏蔽线程创建、销毁的成本
  • 提供 Future 异步结果接口
  • 简化并发代码结构

主要类关系:

1
2
3
4
5
Executor
└── ThreadPoolExecutor
├── Worker threads
├── WorkQueue
└── Future

核心对象:

组件 作用
ThreadPoolExecutor 线程池管理器
threading.Thread 实际执行任务的工作线程
queue.Queue 任务队列(FIFO)
Future 任务结果占位符
_WorkItem 任务封装单元

线程池调度

Python 线程池使用的是:集中式任务队列 + 抢占式获取任务

1
2
3
4
5
+-------------------+
| Queue (FIFO) |
+-------------------+
↑ ↑ ↑
Worker Worker Worker

任务调度是FIFO使用queue.Queue。线程调用是竞争式,所有worker线程阻塞在queue.get(),哪个线程被OS唤醒哪个线程先执行。

具体实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from concurrent.futures import ThreadPoolExecutor

pool = ThreadPoolExecutor(max_workers=10)
number = 0


def task_add(add_number=1):
global number
number += add_number
return number


def task_get(future):
print(f"Currner Number is {future.result()}")


future_list = []
# 一次性将任务提交给线程池
for item in range(int(1e4)):
future = pool.submit(task_add, item)
future_list.append(future)
if item % 1000 == 0:
future.add_done_callback(task_get) # 线程执行完成后的回调

print("Loop End")
pool.shutdown(wait=True) # 等待线程池中的任务全部执行完成
sum_count = sum([future.result() for future in future_list])
print(f"End,Sum Count is:{sum_count},Current Number is:{future_list[1000].result()}")

output:

1
2
3
4
5
6
7
8
9
10
11
12
Currner Number is 0
Currner Number is 500212
Currner Number is 2000749
Currner Number is 4501249
Currner Number is 7968646
Currner Number is 12472848
Currner Number is 17965886
Currner Number is 40476059
Currner Number is 31970260
Currner Number is 24471687
Loop End
End,Sum Count is:166778486073,Current Number is:500212
作者

Kim

发布于

2026-01-19

更新于

2026-01-20

许可协议

CC BY-NC-SA 4.0