Python中的全局解释器锁吉尔是什么

Python中的全局解释器锁吉尔是什么?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

<强>全局解释器锁吉尔(CPython的)

Python代码的执行由Python虚拟机(也叫解释器主循环)来控制.CPython在执行多线程的时候并不是线程安全的,所以为了程序的稳定性,加一把全局解释锁,确保任何时候都只有一个Python线程执行。虽然Python解释器中可以“运行”多个线程,但在同一时刻只有一个线程在解释器中运行。

我们所说的Python全局解释锁(GIL)简单来说就是一个互斥体(或者说锁),这样的机制只允许一个线程来控制Python解释器.GIL对执行单线程任务的程序员们来说并没什么显著影响,但是它成为了计算密集型(cpu)和多线程任务的性能瓶颈。

在多线程环境中,Python虚拟机按以下方式执行:

,设置吉尔。

b,切换到一个线程去运行;

c,运行指定数量的字节码指令或者线程主动让出控制(可以调用time . sleep (0));

d,把线程设置为睡眠状态;

e,解锁吉尔。

f,再次重复以上所有步骤。

在调用外部代码(如c/c++扩展函数)的时候,吉尔将会被锁定,直到这个函数结束为止(由于在这期间没有Python的字节码被运行,所以不会做线程切换)编写扩展的程序员可以主动解锁吉尔。

<强> Python多线程模块的选择:

Python提供了几个用于多线程编程的模块,包括线程,线程和队列等.thread和线程模块允许程序员创建和管理线程.thread模块提供了基本的线程和锁的支持,线程提供了更高级别,功能更强的线程管理的功能.Queue模块允许用户创建一个可以用于多个线程之间共享数据的队列数据结构。

避免使用螺纹模块,因为更高级别的线程模块更为先进,对线程的支持更为完善,而且使用螺纹模块里的属性有可能会与线程出现冲突;其次低级别的螺纹模块的同步原语很少(实际上只有一个),而线程模块则有很多;再者,线模块中当主线程结束时,所有的线程都会被强制结束掉,没有警告也不会有正常的清除工作,至少线程模块能确保重要的子线程退出后进程才退出只

螺纹模块不支持守护线程,当主线程退出时,所有的子线程不论它们是否还在工作,都会被强行退出。而线程模块支持守护线程,守护线程一般是一个等待客户请求的服务器,如果没有客户提出请求它就在那等着,如果设定一个线程为守护线程,就表示这个线程是不重要的,在进程退出的时候,不用等待这个线程退出。

看完上述内容,你们掌握Python中的全局解释器锁吉尔是什么的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

Python中的全局解释器锁吉尔是什么