一文掌握Python的全局解释器锁 (GIL)

B站影视 2025-01-30 08:27 1

摘要:全局解释器锁 (GIL)是同步线程执行的 Python 互斥锁。它通过防止多个线程同时执行 Python 字节码来保护对 Python 对象的访问。GIL 用于管理内存、确保线程安全以及支持 C 扩展。它可以防止争用问题,并保证在多线程环境中正确管理引用计数。

全局解释器锁 (GIL) 是同步线程执行的 Python 互斥锁。它通过防止多个线程同时执行 Python 字节码来保护对 Python 对象的访问。GIL 用于管理内存、确保线程安全以及支持 C 扩展。它可以防止争用问题,并保证在多线程环境中正确管理引用计数。它还确保 Python 的内置数据结构和 C 扩展只能由一个线程操作,使它们成为线程安全的,并且无需复杂的锁定方法。

GIL 是 Python 是一种如此安全的编程语言的原因之一,尤其是对于学生和编程新手。尽管它通常被认为对语言有利,因为它消除了真正的异步运行时和并行性。因此,GIL 对多线程 Python 程序有重大影响,而对单核速度没有影响。但是,它可能代表多核计算机上 CPU 密集型线程的瓶颈,因为一次只有一个线程可以执行 Python 字节码。对于 I/O 绑定的进程,GIL 的问题较小,因为线程可以在 I/O 操作完成时释放它。

通过创建一个 python 脚本来测试这一点,该脚本具有一个 CPU 绑定任务和一个运行线程的任务,为每个线程计时以查看哪个线程执行得更快,从而了解 GIL 如何影响简单程序的速度和效率:

"""This script demonstrates the performance impact of using multiple threads to run a CPU-bound task."""import threadingimport timedef cpu_bound_task -> None: """ A CPU-bound task that does nothing but waste CPU cycles. """ for _ in range(10 ** 7): passdef run_threads(num_threads: int) -> float: """ Run the CPU-bound task using the specified number of threads. Args: num_threads: The number of threads to use. """ threads = start_time = time.time for _ in range(num_threads): thread = threading.Thread(target=cpu_bound_task) threads.append(thread) thread.start for thread in threads: thread.join end_time = time.time return end_time - start_timeif __name__ == "__main__": print(f"Single thread time: {run_threads(1):.2f} seconds") print(f"Multi-thread time: {run_threads(4):.2f} seconds")

结果将如下所示。尝试在您的机器上运行它:

Single thread time: 0.07 secondsMulti-thread time: 0.28 secondsProcess finished with exit code 0

您会注意到,由于 GIL 的原因,多线程版本并没有提供显著的加速。

来源:自由坦荡的湖泊AI

相关推荐