

在之前的文章Python基础篇 - 多进程-进程池中,我们认识了进程池的创建。今天的Python基础篇知识将介绍线程池。
关于进程与线程的概念,在文章Python基础篇 - 进程与线程、并发与并行有详细的介绍。

一.线程池
线程池就是提前开好固定数量的线程,循环反复干活,不销毁、不重复创建。
在之前,多线程的创建,手动创建多个线程:来一个任务,相当于招一个工人,干完就辞退。 频繁招人辞退,浪费时间、浪费资源。但是,线程池:提前固定招好若干个工人,任务来了就干活,干完不辞退,坐等下一个任务。实现复用,效率极高。
线程池的API是ThreadPoolExecutor
任务提交方法主要是两个:submit和map
submit:提交不同的单个任务,适合参数不一样、灵活获取返回。
map:批量批量自动传参,适合批量统一任务。
1. submit-单任务异步
from concurrent.futures import ThreadPoolExecutorimport time# 定义线程任务def work_1(num):print(f"任务{num}开始执行")time.sleep(1) # 模拟任务耗时return f"任务{num}执行完成"def work_2(name):print(f"{name}开始工作")time.sleep(1)return f"{name}已经工作完成"if __name__ == "__main__":# 创建线程池,最大3个线程同时工作pool = ThreadPoolExecutor(max_workers=3)# 提交任务# submit(fn(任务函数),args(函数参数))future1 = pool.submit(work_1,1)future2 = pool.submit(work_2,'xiaoming')# result()方法获取结果work1 = future1.result()work2 = future2.result()# 关闭线程池pool.shutdown()print("所有任务全部结束")
2. map-批量任务
from concurrent.futures import ThreadPoolExecutorimport time# 定义线程任务def work(num):print(f"任务{num}开始执行")time.sleep(1) # 模拟任务耗时return f"任务{num}完成"if __name__ == "__main__":pool = ThreadPoolExecutor(max_workers=3)# 批量自动执行任务nums = [1,2,3,4,5]results = pool.map(work, nums)# 遍历结果,无需result方法for res in results:print(res)# 关闭线程池pool.shutdown()print("全部任务结束")
可以看到,submit方法适合任务不一致,需要单独拿到结果的情况;map方法适合同一批量任务的生产情况。

总结:今日我们学习了Python基础篇-多线程-线程池。线程池可以创建固定数量线程,实现线程复用,避免频繁创建销毁线程带来的资源消耗,有效控制并发数量。通过ThreadPoolExecutor创建线程池的两种常用提交方法:submit提交单个异步任务,map批量统一执行任务,掌握线程池创建、任务提交和shutdown关闭收尾操作。在Python基础篇,后续我们将持续学习Python基础知识,介绍各种算法,祝每一位study er学习愉快。

