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:实现类型,遵循鸭子类型,不需要显示的继承一个类,只要类中有对应的属性跟方法,我们就称这几个类的对象为同一种类型
标签:__,协程,对象,互斥,线程,鸭子,类型,进程
From: https://www.cnblogs.com/liyuanxiangls/p/17605890.html