GIL锁、深浅拷贝、模块导入和上下文管理器

简介: GIL锁、深浅拷贝、模块导入和上下文管理器

GIL


 

GIL概念

  1. 1.GIL (Global Interpreter Lock ) 全局解释器锁。
  2. 2.GIL 不是 Python 语言的特性,是CPython中的一个概念。
  3. 3.Python 解释器也是一个应用程序

 

GIL作用

  1. 1.线程互斥锁是 Python 代码层面的锁,解决 Python 程序中多线程共享资源的问题
  2. 2.GIL __ Python 解释层面的锁,解决解释器中多个线程的竞争资源问题。

 

GIL对程序的影响

  1. 1.由于 GIL 的存在, Python程序中同一时刻有且只有一个线程会执行。
  2. 2.Python 中的多线程_由于 GIL 锁的存在无法利用多核 CPU
  3. 3.Python 中的多线程不适合计算密集型的程序。
  4. 4.GIL 锁在遇到IO等待时,会释放 GIL 锁,可以提高Python_IO密集型_程序的效率

 

GIL影响的解决办法

如果程序需要大量的计算,利用多核CPU资源,可以使用多进程来解决

 


深拷贝和浅拷贝



基本概念

  1. a.Python中一切皆对象
  2. b.对象可分为不可变对象和可变对象两种
  3. c.变量在内存中开辟的地址称为引用

 

引用赋值

  1. a.对象间的赋值操作是对地址的引用操作
  2. b.在不可变对象赋值时,不可变对象不会被修改,而是会新开辟一个空间
  3. c.在可变对象中赋值时,只是将可变对象中保存的引用进行更改

 

拷贝

  1. a.使用 copy 模块完成拷贝
  2. b.copy模块可以实现浅拷贝和深拷贝两种拷贝

 

浅拷贝

  1. a.使用 copy 模块中的 copy 方法
  2. b.对于不可变对象,浅拷贝和赋值没有区别
  3. c.对于可变对象,只复制当前对象的第一层引用
  4. d.如果可变对象中的对象发生变化 ,拷贝对象也随之变化

 

深拷贝

  1. a.使用 copy 模块中的  deepcopy 方法
  2. b.对于不可变对象,深拷贝和赋值没有区别
  3. c.对于可变对象,深拷贝会逐层拷贝所有的数据的引用
  4. d.修改可变对象中的对象数据时,拷贝对象不会随之变化

 

默认拷贝方式

程序中默认使用浅拷贝


浅拷贝的几种实现形式

  1. a.copy 模块的 copy 方法
  2. b.对象本身的 copy 方法
  3. c.工厂方法
  4. d.切片

 

浅拷贝的优势

  1. a.拷贝时间短
  2. b.占用空间少
  3. c.拷贝效率高

 

 

 

模块导入


     

模块概念

  1. 1.在 Python 中,一个文件就是一个模块
  2. 2.将多个文件放在一个文件夹内进行组织管理的形式称为包

 

模块导入方式

  1. 1.import
  2. 2.from-import

 

使用模块别名

可以使用 as 在导入模块后,为模块添加别名,方便程序中引用

 

模块搜索顺序

     模块在搜索时,根据 sys 模块中定义的 path 变量中保存的路径进行搜索



默认搜索顺序为:

  1. 1.当前程序所在目录
  2. 2.当前程序根目录
  3. 3.PYTHONPATH
  4. 4.标准库目录
  5. 5.第三方库目录site-packages目录

 

添加搜索路径

因为 path 是列表类型,可以使用 append 方法向 path 变量中添加模块搜索路径。

 

重新加载模块

  1. 1.模块在导入后,会在 sys.modules 中创建一个模块对象
  2. 2.如果被导入的模块发生了修改,那么需要重新导入模块
  3. 3.from imp import reload   — reload(xxx)    已不建议使用
  4. 4.from importlib import reload — reload(xxx)
  5. 5.重新导入的前提是程序没有结束,如果结束了重新运行就相当于重新导入了。

 

import 和 from-import 的区别

  1. 1.可以将 import 导入方式理解成浅拷贝,只是拷贝了模块的一个引用。通过引用可以使用所有的数据。
  2. 2.from-import方式在导入数据时,会将导入模块中数据复制一份到当前文件中,所以可以直接使用模块中的变量,函数,类等内容。
  3. 3.使用from-import 方式导入可能会出现命名冲突问题。
  4. 4.从使用便利的角度,使用from-import
  5. 5.从命名冲突的角度,使用 import

 

循环导入

  1. 1.循环导入不是语法,而是在程序编写过程中的一种逻辑错误
  2. 2.开发过程中需要避免循环导入

   

 

 

with 上下文管理器


   

语法糖

  1. i.Python 提供的一种简化语法,在编写代码时更加简洁
  2. ii.with 就是众多语法糖中的一种

 

with 执行原理

  1. i.能通过with进行执行的语句,都是实现了上下文管理器
  2. ii.上下文管理器中包含两个魔法方法__enter__  和__exit__
  3. iii.__enter__ 方法提供环境的初始化操作
  4. iv.__exit__ 方法提供了环境的善后操作,一般用来做资源的关闭

 

__exit__方法中的参数

  1. i.__exit__ 方法中提供三个参数,用来接收执行with语句时发生的异常。
  2. ii.三个参数分别为 异常信息类型,异常信息值和异常回溯信息
  3. iii.__exit__ 方法默认返回 False ,默认将异常信息抛出
  4. iv.可以设置返回值为 True,不将异常信息抛出
相关文章
|
4月前
|
Python
在Python中,`multiprocessing`模块提供了一种在多个进程之间共享数据和同步的机制。
在Python中,`multiprocessing`模块提供了一种在多个进程之间共享数据和同步的机制。
|
6月前
|
存储 安全 IDE
C/C++ 作用域,生命周期,执行线程的概念
C/C++ 作用域,生命周期,执行线程的概念
58 2
|
6月前
|
安全 Python
如何在Python中处理多线程之间的共享状态?
如何在Python中处理多线程之间的共享状态?
60 3
|
6月前
|
Java 程序员 API
【深入探究 Qt 线程】一文详细解析Qt线程的内部原理与实现策略
【深入探究 Qt 线程】一文详细解析Qt线程的内部原理与实现策略
570 0
|
6月前
|
安全 Python
在Python中,如何使用锁和条件变量来确保代码片段是线程安全的?
在Python中,如何使用锁和条件变量来确保代码片段是线程安全的?
49 0
|
监控 Python
Python函数-上下文管理器
Python函数-上下文管理器
58 0
|
安全 Python
【从零学习python 】79. 线程访问全局变量与线程安全问题
【从零学习python 】79. 线程访问全局变量与线程安全问题
84 0
|
安全 调度 Python
【从零学习python 】80.线程访问全局变量与线程安全问题
【从零学习python 】80.线程访问全局变量与线程安全问题
100 0
|
Python
【Python零基础入门篇 · 21】:多线程的封装和使用、线程的同步、互斥锁、执行的任务有参数
【Python零基础入门篇 · 21】:多线程的封装和使用、线程的同步、互斥锁、执行的任务有参数
215 0
【Python零基础入门篇 · 21】:多线程的封装和使用、线程的同步、互斥锁、执行的任务有参数