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 day28_GIL 深拷贝浅拷贝_第1张图片
1.png
Python day28_GIL 深拷贝浅拷贝_第2张图片
2.png

2. 深拷贝

  • 深拷贝是对于一个对象所有层次的拷贝(递归)
Python day28_GIL 深拷贝浅拷贝_第3张图片
3.png
进一步理解深拷贝
Python day28_GIL 深拷贝浅拷贝_第4张图片
4.png
Python day28_GIL 深拷贝浅拷贝_第5张图片
5.png

3. 拷贝的其他方式

  • 分片表达式可以赋值一个序列
Python day28_GIL 深拷贝浅拷贝_第6张图片
6.png
  • 字典的copy方法可以拷贝一个字典
Python day28_GIL 深拷贝浅拷贝_第7张图片
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 day28_GIL 深拷贝浅拷贝_第8张图片
8.png

copy.copy和copy.deepcopy的区别

copy.copy

Python day28_GIL 深拷贝浅拷贝_第9张图片
9.png
Python day28_GIL 深拷贝浅拷贝_第10张图片
10.png

copy.deepcopy

Python day28_GIL 深拷贝浅拷贝_第11张图片
11.png
Python day28_GIL 深拷贝浅拷贝_第12张图片
12.png
Python day28_GIL 深拷贝浅拷贝_第13张图片
13.png

你可能感兴趣的:(Python day28_GIL 深拷贝浅拷贝)