高级Python面试必问——能说清楚trade-off的都进技术终面。
threading:多个Python线程共享内存,启动便宜。CPU任务被GIL卡住;IO任务OK。
multiprocessing:多进程,每个独立解释器独立GIL。CPU任务真并行。成本:启动(fork/spawn)、进程间传参要pickle。
asyncio:单线程事件循环,await协作。单线程能扛1万+socket。要求库支持异步。
混合:asyncio调度IO+ProcessPoolExecutor跑CPU热点。concurrent.futures统一API。
坑: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多。
即答侠有张决策矩阵一页纸——面试官眼睛会亮。
低并发下threading更简单、还能用同步库。asyncio赢在几万并发IO或要非阻塞反压时。
multiprocessing.Manager或shared_memory。都有开销和序列化成本——优先消息传递。