“线程是并发还是并行?进程又是并发还是并行?”面试官这问题一出口,我脑子里先是一片空白,然后开始快速检索我那台老旧大脑里的缓存——到底谁是并发,谁是并行?
作为一个写 Python 的程序员,我平时写多线程的机会说多也不多,说少吧也不算少,但真让我嘴上整出个定义,还真容易一脸懵。
所以,这篇就当给自己和大家补个课,也算是个“面试保命指南”。
并发和并行,到底啥区别?
先别急着答问题,我们得先整明白“并发”和“并行”到底是个啥。
• 并发(Concurrency):多个任务在“同一个时间段”交替执行,看起来像同时发生,但其实是你一下、我一下,大家轮流干活。比如单核 CPU 模拟多线程运行,就是通过任务切换来实现的。
• 并行(Parallelism):多个任务在“同一时刻”真的同时执行。比如多核 CPU 上一个线程一个核,大家一起跑步,不用轮流。
用个比喻:你一个人炒三个菜,这叫并发;你找俩室友一人炒一个,这叫并行。
那线程和进程呢?是并发还是并行?
这问题本身其实是个陷阱,因为“线程”和“进程”是实现单位,不是“方式”。他们可以是并发,也可以是并行,关键在于你的操作系统和硬件怎么安排。
但我们以 Python 的角度来看,事情就复杂了一点:
Python 中的线程:通常是并发
原因:GIL(全局解释器锁)

上面这个程序跑起来,你会发现就算你电脑有 8 核,也还是用不到几个核。因为 GIL 存在于 CPython(Python 最主流的实现)中,限制了同一时刻只能有一个线程在执行 Python 字节码。
所以多线程在 Python 中,CPU 密集型任务是并发(轮流跑),但不是并行。
不过,如果你是搞 IO 密集型的事(比如网络请求、读写文件),Python 的线程还是挺香的,因为线程会在等待 IO 的时候切出去,让其他线程继续跑,这就很高效。
Python 中的进程:可以并行
用 multiprocessing 模块就能创建多个子进程,每个进程有自己独立的内存空间和 GIL,所以可以真正实现并行。

这时候你的 CPU 就是真的双核齐飞了,能感受到明显的加速。
面试中怎么答更靠谱?
面试官一问你线程并发还是并行,你要先反问一句:“您是指 Python 中的吗?”
然后根据情况出招:
• 如果是 Python 的线程:并发(主要受 GIL 限制)
• 如果是 Python 的进程:并行(多核执行,互不干扰)
• 补充一句:如果是其他语言(比如 Java、C++)的线程,那线程也可能实现并行,因为它们没有 GIL。
顺便丢一句“IO 密集型任务用线程,CPU 密集型任务用进程”,再加点示例代码,完事收工。
日常开发咋选?线程还是进程?
我自己觉得还是得看场景:
• 爬虫、文件下载、数据库操作:线程更轻便,适合用 threading 或 concurrent.futures.ThreadPoolExecutor
• 大规模数据计算、图像处理、模型训练:果断用 multiprocessing,或者更高级的并行框架,比如 joblib, dask 等
当然,写了这么多,不如现场背一段“金句”,比如:
“在 Python 中,由于 GIL 的限制,线程多用于 IO 密集型任务,而进程更适合 CPU 密集型任务,实现真正的并行计算。”
你这一说,八成面试官也懵了,咱算是扳回一局。
下次再有人问我线程并发还是并行,我可得先笑一下,再扔一段代码,让他看看咱也是刷过面经的“资深调度器”。
以上就是“python面试题:线程是并发还是并行,进程是并发还是并行?”的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://www.phpxs.com/post/13484/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料
查 看2022高级编程视频教程免费获取