Python 面试题

Python并发:multiprocessing、threading、asyncio怎么选

什么时候用multiprocessing、threading、asyncio?

为什么面试官会问这道题

高级Python面试必问——能说清楚trade-off的都进技术终面。

如何回答

  1. 1

    threading:多个Python线程共享内存,启动便宜。CPU任务被GIL卡住;IO任务OK。

  2. 2

    multiprocessing:多进程,每个独立解释器独立GIL。CPU任务真并行。成本:启动(fork/spawn)、进程间传参要pickle。

  3. 3

    asyncio:单线程事件循环,await协作。单线程能扛1万+socket。要求库支持异步。

  4. 4

    混合:asyncio调度IO+ProcessPoolExecutor跑CPU热点。concurrent.futures统一API。

  5. 5

    坑:Windows的multiprocessing用spawn(无fork)→所有参数必须能pickle;asyncio里阻塞调用会冻死loop。

参考回答示例

三向选择。CPU密集:multiprocessing或原生(numpy/numba)——threading被GIL卡住没法并行。IO密集<100并发:线程够简单够用。IO密集上千并发socket:asyncio——事件循环比每连接一线程扩得多。混合场景常见:asyncio调度IO、CPU热点用run_in_executor丢进ProcessPoolExecutor。坑:asyncio handler里任何同步阻塞都冻结整个loop——要用to_thread包。Windows的multiprocessing一切都pickle重启,闭包不保留。我新服务默认asyncio、数据管道式CPU任务用multiprocessing。

实用技巧

  • asyncio.run()+每进程一个event loop——别跨线程混用loop。

  • 进程池大小≈os.cpu_count();线程池可以更大如果任务IO多。

  • 即答侠有张决策矩阵一页纸——面试官眼睛会亮。

常见问题

IO场景asyncio一定比threading好?

低并发下threading更简单、还能用同步库。asyncio赢在几万并发IO或要非阻塞反压时。

进程间怎么共享对象?

multiprocessing.Manager或shared_memory。都有开销和序列化成本——优先消息传递。

面试时担心忘词?即答侠实时助你

即答侠 AI 实时监听面试对话,自动识别问题并即时生成回答建议——无感辅助,让你从容应对每一道题。

免费试用即答侠