编程后端开发者

描述Python中的线程工作模型。什么是GIL,它如何影响并行性?如何在Python中解决并行计算问题?

用 Hintsage AI 助手通过面试

答案。

在Python标准库中提供了threading模块用于多线程。线程允许在一个进程中并行执行多个操作。然而,在Python的标准实现(CPython)中,有一个机制GIL(全局解释器锁) — 该锁只允许一个线程同时执行Python字节码。

这意味着在CPython中,多线程无法在处理器级别实现真正的并行性;并行性仅对等待相关的任务(I/O-bound)有用。对于CPU-bound任务,建议使用multiprocessing模块,该模块启动多个进程以绕过GIL。

示例:

import threading def worker(): print('开始') # 重计算 print('结束') threads = [threading.Thread(target=worker) for _ in range(5)] for t in threads: t.start() for t in threads: t.join()

对于密集计算的并行性,使用multiprocessing:

from multiprocessing import Pool def square(x): return x*x with Pool(4) as p: print(p.map(square, [1, 2, 3, 4]))

有陷阱的问题。

在Python中多线程能加速计算密集型任务吗?

答案: 不,因为在Python的标准实现(CPython)中,由于GIL,线程在CPU-bound任务中不会提供性能提升;对于这类任务,请使用multiprocessing或不具有GIL的第三方解释器实现(例如Jython,IronPython)。

由于不了解主题的细微差别而导致的真实错误示例。


故事

在一个处理大数据量的项目中,团队尝试通过线程(threading)来加速计算。然而,时间反而增加了,因为GIL阻止了线程的并行工作;转换为multiprocessing后,任务顺利解决。


故事

开发者试图同时下载大文件并在多个线程中处理它们,但由于不谨慎使用共享变量而没有锁(线程安全),经常遇到“死锁”。


故事

在后端服务器上实现了在线程池中处理重请求。当负载增加时,服务器开始“挂起” — 发现大多数时间线程都在等待执行Python代码,这都是由于GIL的原因,尽管请求与密集I/O无关。