个人网站开发实例,上海画册设计,花生壳怎么做网站,wordpress默认排序一、介绍
全局解释锁#xff08;Global Interpreter Lock#xff0c;GIL#xff09;是在某些编程语言的解释器中使用的一种机制。在Python中#xff0c;GIL是为了保证解释器线程安全而引入的。
GIL的作用是在解释器的执行过程中#xff0c;确保同一时间只有一个线程可以…一、介绍
全局解释锁Global Interpreter LockGIL是在某些编程语言的解释器中使用的一种机制。在Python中GIL是为了保证解释器线程安全而引入的。
GIL的作用是在解释器的执行过程中确保同一时间只有一个线程可以执行Python字节码。这意味着在多线程的情况下同一时刻只有一个线程可以真正地执行Python代码其他线程只能等待。这是因为GIL会在解释器的关键部分进行加锁阻止其他线程的执行。
二、 对多线程 Python 程序的影响
CPU 密集型程序是那些将 CPU 推向极限的程序。这包括进行数学计算的程序如矩阵乘法、搜索、图像处理等。
I/O 绑定程序是花时间等待输入/输出的程序这些输入/输出可能来自用户、文件、数据库、网络等。I/O 绑定程序有时必须等待很长时间直到它们从源获得所需的内容因为源可能需要在输入/输出准备就绪之前进行自己的处理例如用户考虑在输入提示或在其自己的进程中运行的数据库查询中输入什么。
下面是一个多线程的程序
# single_threaded.py
import time
from threading import ThreadCOUNT 50000000def countdown(n):while n0:n - 1start time.time()
countdown(COUNT)
end time.time()print(Time taken in seconds -, end - start) 现在修改了代码以使用两个线程并行执行相同的倒计时代码
# multi_threaded.py
import time
from threading import ThreadCOUNT 50000000def countdown(n):while n0:n - 1t1 Thread(targetcountdown, args(COUNT//2,))
t2 Thread(targetcountdown, args(COUNT//2,))start time.time()
t1.start()
t2.start()
t1.join()
t2.join()
end time.time()print(Time taken in seconds -, end - start) 再次运行结果如下 两个版本完成所需的时间几乎相同。在多线程版本中GIL 阻止 CPU 绑定线程并行执行。
GIL 对 I/O 绑定的多线程程序的性能没有太大影响因为在线程等待 I/O 时锁在线程之间共享。
但是线程完全受 CPU 限制的程序例如使用线程在部分中处理图像的程序不仅会因为锁而变成单线程而且执行时间也会增加如上例所示与编写为完全单线程的情况相比多线程增加的时间是由获取锁和释放锁带来的开销。
三、如何摆脱 Python 的全局锁的限制
1、使用多进程方法
每个 Python 进程都有自己的 Python 解释器和内存空间因此 GIL 不会成为问题。Python 有一个多进程multiprocessing 模块它让我们可以轻松地创建这样的进程
from multiprocessing import Pool
import timeCOUNT 50000000
def countdown(n):while n0:n - 1if __name__ __main__:pool Pool(processes2)start time.time()r1 pool.apply_async(countdown, [COUNT//2])r2 pool.apply_async(countdown, [COUNT//2])pool.close()pool.join()end time.time()print(Time taken in seconds -, end - start)
与多线程版本相比性能有所提高。 2、使用 使用并发库比如cython 、asyncio、gevent、eventlet 等。这些库使用非阻塞 I/O 和协程等技术可以在单个线程中实现高效的并发处理避免 GIL 的限制。来避开全局锁 3、使用替代Python解释器
Python有多个解释器实现。CPythonJythonIronPython和PyPy分别用CJavaC#和Python编写是最受欢迎的。GIL 只存在于 CPython 的原始 Python 实现中。如果你的程序及其库可用于其他实现那么也可以尝试使用它们。当然使用非官方解释器的代价是无法使Cython.
参考
什么是Python全局锁(GIL)如何避开GIL限制_python 全局锁___弯弓__的博客-CSDN博客