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锁
结论:
- 在 处理像科学计算 这类需要持续使用cpu的任务的时候 单线程会比多线程快
- 在 处理像IO操作等可能引起阻塞的这类任务的时候 多线程会比单线程快
- 浅拷贝是对于一个对象的顶层拷贝
文章图片
1.png
文章图片
2.png 2. 深拷贝
- 深拷贝是对于一个对象所有层次的拷贝(递归)
文章图片
3.png 进一步理解深拷贝
文章图片
4.png
文章图片
5.png 3. 拷贝的其他方式
- 分片表达式可以赋值一个序列
文章图片
6.png
- 字典的copy方法可以拷贝一个字典
文章图片
7.png 4. 注意点
浅拷贝对不可变类型和可变类型的copy不同
- copy.copy对于可变类型,会进行浅拷贝
- 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
文章图片
8.png copy.copy和copy.deepcopy的区别
copy.copy
文章图片
9.png
文章图片
10.png
【Python|Python day28_GIL 深拷贝浅拷贝】copy.deepcopy
文章图片
11.png
文章图片
12.png
文章图片
13.png
推荐阅读
- python学习之|python学习之 实现QQ自动发送消息
- 逻辑回归的理解与python示例
- python自定义封装带颜色的logging模块
- 【Leetcode/Python】001-Two|【Leetcode/Python】001-Two Sum
- Python基础|Python基础 - 练习1
- Python爬虫|Python爬虫 --- 1.4 正则表达式(re库)
- Python(pathlib模块)
- python青少年编程比赛_第十一届蓝桥杯大赛青少年创意编程组比赛细则
- Python数据分析(一)(Matplotlib使用)
- Python|Python 9.20