GIL是CPython解释器中存在的,通常解释器都是CPython,同一时刻只有一个线程在运行,并且不能利用CPU多核的特性,因此没法实现并行。python
设置GIL锁算法
切换到一个线程执行数据库
执行如下指令:多线程
执行指定数量的代码socket
遇到延时(time.sleep、io操做、socket的recv、accept、content等)操做,线程让出控制权tcp
释放GIL锁函数
切换出线程工具
重复上述步骤 因此,多线程和多进程、协程的应用场景:spa
浅拷贝就是拷贝对象的引用地址,内存地址不变 通常常见的浅拷贝有:线程
切片
list() 非数据类型转换
dict.copy() 字典拷贝
导入模块copy
import copy
copy.copy()
复制代码
浅拷贝不能拷贝不可变类型数据,不可变类型中存在可变数据也不进行拷贝
深拷贝就是拷贝对象的全部,拷贝引用地址,改变内存地址而且复制其中的数据
import copy
copy.deepcopy()
复制代码
深拷贝不能拷贝不可变类型,但其中只要存在一个可变类型的数据,就可作深拷贝
mro即method resolution order(方法解释顺序),解决Python多继承出现的二义性问题: 例:
class A():
def f(self):
pass
class B(A):
def f(self):
pass
class C(A, B):
def f(self):
pass
class D(B, C):
def f(self):
pass
class E(C, D):
def f(self):
pass
复制代码
Python中会产生这样的问题,利用C3算法能够肯定子类中继承方法的顺序,该序列保存在子类对象__mro__中
class D(object):
pass
class E(object):
pass
class F(object):
pass
class C(D, F):
pass
class B(E, D):
pass
class A(B, C):
pass
if __name__ == '__main__':
print(A.__mro__)
复制代码
def func(*args, **kwargs)
复制代码
def func(*args, **kwargs):
pass
func(*args, **kwargs)
复制代码
此时表示拆包
例:
class Test(object):
def __init__(name,age):
self.name = name
self.age = age
@classmethod
def test1(cls,name): # cls,类对象
obj = cls(name,18) # 类对象能够建立实例对象
@staticmethod
def test2():
return age<18 and len(name)>6
def test3(self): # self,实例对象
pass
test = Test("sss",19)
复制代码
经过property将类中的方法提高为一个属性,隐藏具体逻辑,对外只需像属性同样访问便可调用方法并得到返回值,简化调用者获取数据的流程
class Date(objecct):
def __init__(self):
self.__name = "sss"
@property
def name(self):
return self.__name
@name.setter
def name(self, value):
self.__name = value
复制代码
class Foo(object):
def get_bar(self):
print("getter...")
return "www"
def set_bar(self, value):
"""必须两个参数"""
print("setter...")
return "set value" + value
def del_bar(self):
print("deleter...")
return "www"
复制代码
若是代码考虑Python版本的兼容性,用类属性的方式建立,不然优先考虑装饰器的方式
系统资源如文件、数据库链接、socket而言,应用程序打开这些资源并执行完业务逻辑以后,必须作的一件事就是要关闭(断开)该资源。为了不每次都手动去关闭这些资源,可使用with关键字,好比:
with open("output.txt", "r") as f:
f.write("python")
复制代码
with后面紧挨的语句返回的对象必须是一个上下文管理器,任何实现了__enter__()和__exit__()方法的对象均可称为上下文管理器。 例:
class SocketManager():
def __init__(self, ip, port):
self.addr = (ip, port)
def __enter__(self):
self.tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.tcp_socket.connect(self.addr)
return self.tcp_socket
def __exit__(self, exc_type, exc_val, exc_tb):
self.tcp_socket.close()
with SocketManager("127.0.0.1", 7890) as s:
s.recv(1024)
s.send(b"hello")
复制代码
若是中间遇到异常close方法也会被调用