线程池
线程池的基类是 concurrent.futures 模块中的 Executor,Executor 提供了两个子类,即 ThreadPoolExecutor 和 ProcessPoolExecutor,其中 ThreadPoolExecutor 用于创建线程池,而 ProcessPoolExecutor 用于创建进程池。
如果使用线程池/进程池来管理并发编程,那么只要将相应的 task 函数提交给线程池/进程池,剩下的事情就由线程池/进程池来搞定。
Exectuor 提供了如下常用方法:
如下程序使用 Executor 的 map() 方法来启动线程,并收集线程任务的返回值:
- from concurrent.futures import ThreadPoolExecutor
- import threading
- import time
-
- # 定义一个准备作为线程任务的函数
- def action(max):
- my_sum = 0
- for i in range(max):
- print(threading.current_thread().name + ' ' + str(i))
- my_sum += i
- return my_sum
- # 创建一个包含4条线程的线程池
- with ThreadPoolExecutor(max_workers=4) as pool:
- # 使用线程执行map计算
- # 后面元组有3个元素,因此程序启动3条线程来执行action函数
- results = pool.map(action, (50, 10, 15,5,6,7,8,9,10))
- print('--------------')
- for r in results:
- print(r)