今天学习内容为GIL锁,深浅拷贝,模块导入以及with
GIL锁:
需要记忆的是如下几点:
为什么可以利用进程和协程来解决:
1.多进程中创建的子进程会将主进程中所有的资源数据拷贝一份,包括GIL锁,每个进程中只有一个主线程,那么就不会存在线程之间的资源竞争问题了。
2.协程是在线程内部进行的,所以也不存在抢锁的问题
深浅拷贝:
概念层面:
不论是深浅拷贝,对于不可变对象,都相当于引用赋值
使用层面:
效果层面:
浅拷贝的优势:花费时间少,花费的内存少,效率高,在工作中常用的都是浅拷贝,程序默认的也是浅拷贝,除非有特殊要求,否则不要使用深拷贝。
模块导入路径:
我们在导入模块,电脑是从哪里找这个模块呢?有一个顺序:
动态加载模块:
有一个前提:就是在程序没有结束的时候
两种方式:
利用reload方法
模块导入方式的区别:
from-import 会有命名冲突的问题
from-import方式在导入时,它相当于将目标模块中的成员复制了一份到本地
相当于深拷贝
被导入模块中的需要的数据被拷贝了一份放在当前文件中
用的时候,不用写对象名了
想访问私有方法需要使用__all__
improt
import 方式保存的是模块的引用
相当于浅拷贝,只是拷贝了模块的一个引用
相当于将一个模块中所有的内容都导入到当前文件中使用
导入了私有方法,我们可以使用
循环导入的问题:
循环导入是一种逻辑错误。
sys.modules是系统加载的全部模块,是一个字典
出现问题的原因:a导入了b模块,开始没有b模块,在创建b完空模块后,对模块会进行初始化(就是对模块从头到尾的扫描一遍),发现第一行是导入a模块,会去创建a的空模块然后再初始化a,发现a模块第一行是导入b模块,那么又去查看b此时,已经有b模块了,但是是空模块,所以调用出错。
解决办法:重构代码
with:
with的作用其实就是简化代码,方便我们操作。
with在进行文件的读写操作的时候会自动的进行文件的关闭,在进行线程的互斥锁的申请时,会在使用完进行关闭。原因就是上下文管理器中的两个魔法方法。
contextmanager上下文管理器中的__enter__
和__exit__
__enter__
用来做创建对象和初始化工作
__exit__
用来文件关闭,数据库关闭,资源回收