为什么有了gil锁还要互斥锁,进程,线程和协程 ,什么是鸭子类型

发布时间 2023-08-04 14:42:01作者: 哈哈哈哼

1 为什么有了gil锁还要互斥锁

-gil锁,全局解释器锁,线程需要运行需要得到gil锁,gil锁不能控制用户级别的安全
-#互斥锁,为了保证多线程并发操作数据而设置的锁,保证在加锁和释放锁之间,其他线程不能操作,让并行变成串行,牺牲效率
-起两个线程。执行任务,x=x+1,x开始等于0
-1 第一个线程过来了,拿到x,计算x=x+1,当计算结果还没有赋值回去
-2 第二个线程来了,拿到x,x还是0,计算x=x+1,线程切换回第一个线程,x变成1

2 进程,线程和协程

-进程,是资源分配的最小单位,一个程序,至少有一个进程
-线程,是cpu调度的最小单位,一个进程至少包含一个线程
-协程,单线程下的并发,程序员控制任务的切换
#开启进程的方法
	'''
	from multiprocessing import Process
    def write_file():
        pass
    if __name__ == "__main__":
        p = Process(target=write_file, args=(), kwargs={})
        p.start()
        p.join()  # 先执行主进程
	'''
    -1 通过Process类实例化得到一个对象,target传入任务,调用对象的start开启进程
    -2 写一个类,继承Process,重写run方法,实例化得到对象,对象.start开启进程
#开启线程的方法
'''
from threading import Thread
def write_file():
    pass
if __name__ == '__main__':
    t = Thread(target=write_file, args={}, kwargs={})
    t.start()
    t.join()
'''
	-1 通过Thread类实例化得到一个对象,target传入任务,对象.start开启线程
    -2 写一个类,继承Thread,重写类的run方法,实例化得到对象,对象.start开启线程
#开启协程
-1 使用gevent模块
-2 async和 await 关键字 
	-async def index()====>执行结果就是协程函数
    -await 只要是io操作,前面加await
#使用
	-1 计算密集型操作开多进程,io密集型开多线程
    -2 爬取别人数据使用多线程
    -3 异步任务可以开多线程

3 什么是鸭子类型

鸭子类型:是一种动态的编程风格,我们更关注对象的行为,而不是对象的类型,我们不需要使用type,isinstance查看他的类型,允许我们在调用方法他的时候,只要对象拥有这个方法,我们就把他当成参数传递过去,而不需要关系类型

# 鸭子类型是python语言面向对象中的一个概念
#面向对象三大特性
	-继承
    -封装
    -多态
# 多态和多态性?
	-多态同一类事物的多种形态
    # 现实生活中
    	-水:冰,水,水蒸气
        -动物:人,狗,猫,猪
	# 程序中
    	-Animal类:子类人,子类狗,子类猫
     -多态性:不考虑对象具体类型的情况下使用对象
     # 程序中
        -len()内置函数---》传参数:字符串对象,列表对象,字典对象
        -len(字典)
     # 为什么能这样用?就是因为多态的存在
    	字符串,列表,字典----》属于同一类事物---》有长度的这一类事物
        
        
# 鸭子类型
	-走路像鸭子,说话像鸭子,我们就可以叫它叫鸭子
    -解释:鸭子类型是python面向对象中描述接口的一个概念,区分与其他编程语言,
    	比如java:实现类型,必须显示的继承这个类
        而python:实现类型,遵循鸭子类型,不需要显示的继承一个类,只要类中有对应的属性跟方法,我们就称这几个类的对象为同一种类型