“线程是并发还是并行?进程又是并发还是并行?”面试官这问题一出口,我脑子里先是一片空白,然后开始快速检索我那台老旧大脑里的缓存——到底谁是并发,谁是并行?
作为一个写 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,所以可以真正实现并行。
更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。
想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!