page contents

python面试题:线程是并发还是并行,进程是并发还是并行?

“线程是并发还是并行?进程又是并发还是并行?”面试官这问题一出口,我脑子里先是一片空白,然后开始快速检索我那台老旧大脑里的缓存——到底谁是并发,谁是并行?

attachments-2025-05-yjjKqhiI6826938a80483.jpg“线程是并发还是并行?进程又是并发还是并行?”面试官这问题一出口,我脑子里先是一片空白,然后开始快速检索我那台老旧大脑里的缓存——到底谁是并发,谁是并行?

作为一个写 Python 的程序员,我平时写多线程的机会说多也不多,说少吧也不算少,但真让我嘴上整出个定义,还真容易一脸懵。

所以,这篇就当给自己和大家补个课,也算是个“面试保命指南”。

并发和并行,到底啥区别?

先别急着答问题,我们得先整明白“并发”和“并行”到底是个啥。

• 并发(Concurrency):多个任务在“同一个时间段”交替执行,看起来像同时发生,但其实是你一下、我一下,大家轮流干活。比如单核 CPU 模拟多线程运行,就是通过任务切换来实现的。

• 并行(Parallelism):多个任务在“同一时刻”真的同时执行。比如多核 CPU 上一个线程一个核,大家一起跑步,不用轮流。

用个比喻:你一个人炒三个菜,这叫并发;你找俩室友一人炒一个,这叫并行。

那线程和进程呢?是并发还是并行?

这问题本身其实是个陷阱,因为“线程”和“进程”是实现单位,不是“方式”。他们可以是并发,也可以是并行,关键在于你的操作系统和硬件怎么安排。

但我们以 Python 的角度来看,事情就复杂了一点:

Python 中的线程:通常是并发

原因:GIL(全局解释器锁)

import threading

def count():

    x = 0

    for _ in range(10**7):

        x += 1

t1 = threading.Thread(target=count)

t2 = threading.Thread(target=count)

t1.start()

t2.start()

t1.join()

t2.join()

上面这个程序跑起来,你会发现就算你电脑有 8 核,也还是用不到几个核。因为 GIL 存在于 CPython(Python 最主流的实现)中,限制了同一时刻只能有一个线程在执行 Python 字节码。

所以多线程在 Python 中,CPU 密集型任务是并发(轮流跑),但不是并行。

不过,如果你是搞 IO 密集型的事(比如网络请求、读写文件),Python 的线程还是挺香的,因为线程会在等待 IO 的时候切出去,让其他线程继续跑,这就很高效。

Python 中的进程:可以并行

用 multiprocessing 模块就能创建多个子进程,每个进程有自己独立的内存空间和 GIL,所以可以真正实现并行。

from multiprocessing import Process

def count():
    x = 0
    for _ in range(10**7):
        x += 1

p1 = Process(target=count)
p2 = Process(target=count)

p1.start()
p2.start()

p1.join()
p2.join()
这时候你的 CPU 就是真的双核齐飞了✈,能感受到明显的加速。
面试中怎么答更靠谱?
面试官一问你线程并发还是并行,你要先反问一句:“您是指 Python 中的吗?”
然后根据情况出招:
• 如果是 Python 的线程:并发(主要受 GIL 限制)
• 如果是 Python 的进程:并行(多核执行,互不干扰)
• 补充一句:如果是其他语言(比如 Java、C++)的线程,那线程也可能实现并行,因为它们没有 GIL。
顺便丢一句“IO 密集型任务用线程,CPU 密集型任务用进程”,再加点示例代码,完事收工。
日常开发咋选?线程还是进程?
我自己觉得还是得看场景:
• 爬虫、文件下载、数据库操作:线程更轻便,适合用 threading 或 concurrent.futures.ThreadPoolExecutor
• 大规模数据计算、图像处理、模型训练:果断用 multiprocessing,或者更高级的并行框架,比如 joblib, dask 等
当然,写了这么多,不如现场背一段“金句”,比如:
“在 Python 中,由于 GIL 的限制,线程多用于 IO 密集型任务,而进程更适合 CPU 密集型任务,实现真正的并行计算。”
你这一说,八成面试官也懵了,咱算是扳回一局。
下次再有人问我线程并发还是并行,我可得先笑一下,再扔一段代码,让他看看咱也是刷过面经的“资深调度器”。
你平时多线程写得多吗?还是你一上来就用 asyncio?

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

  • 发表于 2025-05-16 09:23
  • 阅读 ( 48 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
小柒
小柒

2136 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 2136 文章
  3. Pack 1303 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章