Python 疑难点一: GIL 和 深拷贝/浅拷贝
GIL (全局解释器锁)
一般面试题:
描述Python GIL的概念, 以及它对python多线程的影响
参考答案:
1. GIL 跟Python 语言没有任何关系 , 而仅仅只是跟cpython 解释器有关, 由于历史原因,很久之前的cpu 仅仅只供单线程使用,而如今多cpu 多线程 多任务为主,难以移除GIL;
2.GIL 的意思 就是全局解释器锁 ()global interpreter lock) , 每个线程在执行的时候需要先获取GIL, 保证同一时刻只有一个线程在执行代码
3. 线程释放GIL 锁的情况: 在IO 操作等可能会引起阻塞的system call之前, 可以暂时释放GIL,但在执行完毕之后,必须重新获取GIL
4.对于计算密集型用多进程,多IO密集型用多线程
5.Python 使用多进程是可以利用多核CPU资源的 ; 多线程爬虫比单线程性能有所提高, 因为遇到IO阻塞的时候会自动释放GIL锁
深拷贝 / 浅拷贝
1. 浅拷贝 ----- copy.copy()
浅拷贝是对一个对象的顶层拷贝; 通俗意思就是说 : 只拷贝了引用, 没有拷贝内容,内容仍然是原引用
2.深拷贝----copy.deepcopy()
深拷贝是对一个对象所有层次的拷贝(递归)
3. 拷贝的其他方式
分片表达式 可以赋值一个序列
字典的copy方法可以拷贝一个字典
4.注意点:
[1] 用copy(), deepcopy() 对一个全部都是不可变类型数据进行拷贝,那么结果相同, 都是引用指向
[2]如果 拥有可变数据,即使元祖是最顶层,deepcopy 依旧是深拷贝 ,copy 还是引用指向
[3] 对可变类型来说, 浅拷贝和深拷贝 都会改变重新拷贝一份数据,但是浅拷贝不会改变列表里可变类型的元
素的id, 但深拷贝就会改变可变类型的元素id