【Python编程学记】04 Python高级语法v3.1 | Part 01 GIL锁 与 深、浅拷贝

今天学习的是GIL(全局解释器锁)、深拷贝与浅拷贝,平时敲代码的时候没有特别注意,有针对性的学习一下。

一般是面试题中有这些点,但在Python编程学习过程中,也是会涉及到的,所以干脆就一并再过一遍。

GIL(全局解释器锁)

【Python编程学记】04 Python高级语法v3.1 | Part 01 GIL锁 与 深、浅拷贝_第1张图片

在Ubuntu系统中使用 top命令/htop命令,可以查看当前进程。(为了能够学习到!特意去安装下好了Ubuntu+虚拟机~也配置好了,夸我!)这里想推荐一个博主的安装教程,非常详细,手把手教学,参考部分步骤快速完成了安装。

【Python编程学记】04 Python高级语法v3.1 | Part 01 GIL锁 与 深、浅拷贝_第2张图片

 使用命令可以看到当前运行的一些进程,特意把虚拟机的标识一起截进来。这里和后面的截图不一样的原因是,后面的使用的老师截图,使用的命令是 htop,可以列表显示,显示效果更佳。

为了说明线程间的调用,老师使用了两个例子来讲述,GIL锁是如何对线程造成影响的。

先看代码,导入线程包后,定义一个test函数,函数体死循环。

【Python编程学记】04 Python高级语法v3.1 | Part 01 GIL锁 与 深、浅拷贝_第3张图片

为了更好查看运行代码的状态,老师开了两个窗口去实时查看内存情况。左下浅灰就是上方代码框,右边是新开的进程查看框。 

【Python编程学记】04 Python高级语法v3.1 | Part 01 GIL锁 与 深、浅拷贝_第4张图片

 在另一个界面运行代码,并切换到该页面查看进程内存状态。可以发现两个都占用了将近一半。也可以通过下方的python进程中看到,确实是python编译在活动。

【Python编程学记】04 Python高级语法v3.1 | Part 01 GIL锁 与 深、浅拷贝_第5张图片

为了说明Python程序代码编译的过程,老师画了一张图,从程序到机器运行,中间需要经过解释器。而这也是Python被认为是解释性编程语言的原因。Python解释器有多种,这里举了常见的两种例子,而我们默认的则是C语言编写的cpython解释器。

【Python编程学记】04 Python高级语法v3.1 | Part 01 GIL锁 与 深、浅拷贝_第6张图片

讲到这里,老师提到,GIL是cpython解释器在运行python程序代码中处理多线程问题的遗留问题,jpython解释器中没有。而经过官方致力去解决后,仍难以根除。综合多种解决方案后,选择了保留。

并且,这里给出上面问题的参考答案。 

【Python编程学记】04 Python高级语法v3.1 | Part 01 GIL锁 与 深、浅拷贝_第7张图片

让我用听完课的理解来说一遍,同时也再贴一遍问题:

【Python编程学记】04 Python高级语法v3.1 | Part 01 GIL锁 与 深、浅拷贝_第8张图片

  • 首先什么是GIL呢?也就是全局解释器锁,Global Interpretive Lock ,它是存在于使用Cpython解释器对python代码进行处理的时候一种现象。
  • 保证了python的单线程,因为每个线程执行前获取到这个状态,独占解释器!
  • 什么时候释放呢?不一定是线程结束,有的读写较久,为了避免引起阻塞,会解开一会儿,给别的线程用一下,等到线程恢复还是要使用GIL的。
  • 有个Python 2.X 和 3.X的区别,前者使用tickets计数(理解成计数器),阈值为100,后者用计时器,阈值到释放锁。
  • 多线程是否比单线程性能有提升呢?当然有,我们可以理解成多线程的话,异步发送请求,在发送请求过程中,耗费的时间其实已经得到节省了。
  • 为了简便,可以理解IO阻塞的情况下,切换了其他线程去运行。

这里老师的两个问题我没有涉及到,也就是IO阻塞,这个涉及到操作系统的知识,希望复习后能够搞清楚相关的知识,并串起来,第二个是多线程可利用多核资源,也涉及到OS的知识。可以连到一起记忆。

如何解决GIL的问题呢?老师进行了补充,使用C语言编写了一段:

【Python编程学记】04 Python高级语法v3.1 | Part 01 GIL锁 与 深、浅拷贝_第9张图片

总的来说,提出两个折衷方案:

  1. 第一个避免使用cpython解释器,例如使用jpython替代;
  2. 需要多线程的话,可以使用其他编程语言实现,再用动态加载的方式列入。

深拷贝浅拷贝

忽然发现这部分截图没有,先放着。课听完了,晚点补上截图和笔记。

还是一句老话~刻意练习,每日精进。

 

 

 

 

 

你可能感兴趣的:(学编程使我头秃【学记汇总】,Python高级语法,GIL锁,深拷贝,浅拷贝,编程语言学记,查漏补缺)