🐍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())
追问
submit和map有什么区别- 为什么进程池对可序列化有要求
Future对象能做什么
原理展开
线程池/进程池的核心价值是复用工作单元,避免反复创建线程或进程的开销。
Future 代表一个异步结果,可以:
result()获取结果done()判断是否完成exception()取异常
进程池之所以常有限制,是因为任务和参数往往需要跨进程序列化传输。
面试里建议直接说:
“池化解决的是资源复用和任务调度,线程池偏 IO,进程池偏 CPU,接口上统一在 concurrent.futures 下。”
易错点
- 不分场景就一律上线程池
- 不知道进程池任务要可序列化
- 只会
submit,不会解释Future