Python|Python day28_GIL 深拷贝浅拷贝

GIL(全局解释器锁) GIL面试题如下
描述Python GIL的概念, 以及它对python多线程的影响?编写一个多线程抓取网页的程序,并阐明多线程抓取程序是否可比单线程性能有提升,并解释原因。
Guido的声明:http://www.artima.com/forums/flat.jsp?forum=106&thread=214235
he language doesn't require the GIL -- it's only the CPython virtual machine that has historically been unable to shed it.
参考答案:
Python语言和GIL没有半毛钱关系。仅仅是由于历史原因在Cpython虚拟机(解释器),难以移除GIL。
GIL:全局解释器锁。每个线程在执行的过程都需要先获取GIL,保证同一时刻只有一个线程可以执行代码。
线程释放GIL锁的情况: 在IO操作等可能会引起阻塞的system call之前,可以暂时释放GIL,但在执行完毕后,必须重新获取GIL Python 3.x使用计时器(执行时间达到阈值后,当前线程释放GIL)或Python 2.x,tickets计数达到100
Python使用多进程是可以利用多核的CPU资源的。
多线程爬取比单线程性能有提升,因为遇到IO阻塞会自动释放GIL锁
结论:

  1. 在 处理像科学计算 这类需要持续使用cpu的任务的时候 单线程会比多线程快
  2. 在 处理像IO操作等可能引起阻塞的这类任务的时候 多线程会比单线程快
深拷贝、浅拷贝 1. 浅拷贝
  • 浅拷贝是对于一个对象的顶层拷贝
通俗的理解是:拷贝了引用,并没有拷贝内容

Python|Python day28_GIL 深拷贝浅拷贝
文章图片
1.png Python|Python day28_GIL 深拷贝浅拷贝
文章图片
2.png 2. 深拷贝
  • 深拷贝是对于一个对象所有层次的拷贝(递归)
Python|Python day28_GIL 深拷贝浅拷贝
文章图片
3.png 进一步理解深拷贝 Python|Python day28_GIL 深拷贝浅拷贝
文章图片
4.png Python|Python day28_GIL 深拷贝浅拷贝
文章图片
5.png 3. 拷贝的其他方式
  • 分片表达式可以赋值一个序列
Python|Python day28_GIL 深拷贝浅拷贝
文章图片
6.png
  • 字典的copy方法可以拷贝一个字典
Python|Python day28_GIL 深拷贝浅拷贝
文章图片
7.png 4. 注意点
浅拷贝对不可变类型和可变类型的copy不同
  1. copy.copy对于可变类型,会进行浅拷贝
  2. copy.copy对于不可变类型,不会拷贝,仅仅是指向
In [88]: a = [11,22,33] In [89]: b = copy.copy(a) In [90]: id(a) Out[90]: 59275144 In [91]: id(b) Out[91]: 59525600 In [92]: a.append(44) In [93]: a Out[93]: [11, 22, 33, 44] In [94]: b Out[94]: [11, 22, 33]In [95]: a = (11,22,33) In [96]: b = copy.copy(a) In [97]: id(a) Out[97]: 58890680 In [98]: id(b) Out[98]: 58890680

Python|Python day28_GIL 深拷贝浅拷贝
文章图片
8.png copy.copy和copy.deepcopy的区别
copy.copy
Python|Python day28_GIL 深拷贝浅拷贝
文章图片
9.png Python|Python day28_GIL 深拷贝浅拷贝
文章图片
10.png
【Python|Python day28_GIL 深拷贝浅拷贝】copy.deepcopy
Python|Python day28_GIL 深拷贝浅拷贝
文章图片
11.png Python|Python day28_GIL 深拷贝浅拷贝
文章图片
12.png Python|Python day28_GIL 深拷贝浅拷贝
文章图片
13.png

    推荐阅读