🐍Python 并发与异步

线程池进程池与concurrentfutures

面试回答

常见问法

Python 里线程池、进程池怎么用?concurrent.futures 解决了什么问题?

回答

concurrent.futures 提供了统一的异步任务提交接口,把线程池和进程池抽象成相似的使用方式:

  • ThreadPoolExecutor:适合 IO 密集任务
  • ProcessPoolExecutor:适合 CPU 密集任务
from concurrent.futures import ThreadPoolExecutor

with ThreadPoolExecutor(max_workers=4) as ex:
    future = ex.submit(sum, [1, 2, 3])
    print(future.result())

追问

  • submitmap 有什么区别
  • 为什么进程池对可序列化有要求
  • Future 对象能做什么

原理展开

线程池/进程池的核心价值是复用工作单元,避免反复创建线程或进程的开销。

Future 代表一个异步结果,可以:

  • result() 获取结果
  • done() 判断是否完成
  • exception() 取异常

进程池之所以常有限制,是因为任务和参数往往需要跨进程序列化传输。

面试里建议直接说: “池化解决的是资源复用和任务调度,线程池偏 IO,进程池偏 CPU,接口上统一在 concurrent.futures 下。”

易错点

  • 不分场景就一律上线程池
  • 不知道进程池任务要可序列化
  • 只会 submit,不会解释 Future