推荐答案
// www.javascriptcn.com code example
# GIL(全局解释器锁)是 Python 解释器中的一个互斥锁,用于确保同一时刻只有一个线程执行 Python 字节码。
# 这意味着即使在多核 CPU 上,Python 的多线程程序也无法实现真正的并行执行。
import threading
def worker():
print("Worker thread started")
# 模拟一些计算
sum = 0
for i in range(1000000):
sum += i
print("Worker thread finished")
# 创建多个线程
threads = []
for i in range(5):
t = threading.Thread(target=worker)
threads.append(t)
t.start()
# 等待所有线程完成
for t in threads:
t.join()
print("All threads finished")本题详细解读
什么是 GIL?
GIL(Global Interpreter Lock,全局解释器锁)是 Python 解释器中的一个互斥锁,用于确保同一时刻只有一个线程执行 Python 字节码。GIL 的存在是为了保护 Python 内部数据结构(如引用计数)的线程安全。
GIL 的影响
- 单线程性能:GIL 对单线程程序没有影响。
- 多线程性能:在多线程程序中,GIL 会限制多线程的并行执行,尤其是在 CPU 密集型任务中。即使有多个 CPU 核心,Python 的多线程程序也无法充分利用多核 CPU 的优势。
- I/O 密集型任务:对于 I/O 密集型任务(如文件读写、网络请求),GIL 的影响较小,因为线程在等待 I/O 操作时会释放 GIL。
如何绕过 GIL?
- 使用多进程:Python 的
multiprocessing模块可以绕过 GIL,通过创建多个进程来实现并行计算。 - 使用 C 扩展:在 C 扩展中释放 GIL,允许并行执行 CPU 密集型任务。
- 使用其他 Python 实现:如 Jython 或 IronPython,它们没有 GIL。
代码示例解释
- worker 函数:模拟一个 CPU 密集型任务,计算从 0 到 999999 的和。
- 多线程创建:创建 5 个线程来执行
worker函数。 - 线程启动与等待:启动所有线程,并等待它们完成。
由于 GIL 的存在,这些线程不会真正并行执行,而是轮流获得 GIL 来执行字节码。