摘要:全局解释器锁 (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
免责声明:本站系转载,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与本站联系,我们将在第一时间删除内容!