首页 > 系统相关 >为什么有了gil锁还要互斥锁,进程,线程和协程 ,什么是鸭子类型

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

时间:2023-08-04 14:44:44浏览次数:37  
标签:__ 协程 对象 互斥 线程 鸭子 类型 进程

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

相关文章

  • 线程的五个状态(文字+图示)
    线程五个状态1、新建状态(New):新创建了一个线程对象,和其他java对象一样,仅在堆中分配内存。2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待被线程调度选中,获取CPU的使用权。(指线程已具备了各种执行条件,只......
  • Java多线程总结(超详细总结)
    (Java多线程总结)1.创建线程的方式方式1继承于Thread类创建一个继承于Thread类的子类重写Thread类的run()-->将此线程执行的操作声明在run()中创建Thread类的子类的对象4.通过此对象调用start()例子:遍历100以内的所有的偶数classMyThreadextendsThread{//......
  • 为什么程序计数器、虚拟机栈和本地方法栈是线程私有的呢?为什么堆和方法区是线程共享的
    程序计数器、虚拟机栈和本地方法栈是线程私有的,而堆和方法区是线程共享的,这是由于它们在Java虚拟机中的作用和特性所决定的。程序计数器:程序计数器是一块较小的内存区域,用于存储当前线程正在执行的字节码指令的地址。每个线程都有自己独立的程序计数器,用于记录各自线程的执行......
  • C++11 同步与互斥
    C++11同步与互斥1.std中的锁1.1锁是实现互斥的方法,在std中实现了多种基本锁如下:std::mutex:最基本的互斥锁,只能在同一线程中进行加锁和解锁操作。std::recursive_mutex:递归互斥锁,允许同一线程多次加锁,但必须在同一线程中解锁相同次数。std::timed_mutex:定时互斥锁,允......
  • Qt 在线程中invokeMethod采用QueuedConnection模式,调用带指针参数槽,实际不会调用
    widgetObject有操函数Test:voidTest(int*v);在线程中调用Test,会被忽略,实际不会调用。QMetaObject::invokeMethod(widgetObject,"Test",Qt::QueuedConnection,Q_ARG(int*,&v));下面是网上找的理由: 在同一个线程中当信号和槽都在同一个线程中时,值传递参数和引用传递参数有......
  • 解读 --- System.Windows.Forms.Timer是前台线程吗?
    引言今天同事问了我一个问题,System.Windows.Forms.Timer是前台线程还是后台线程,我当时想的是它是跟着UI线程一起结束的,应该是前台线程吧?我确实没有仔细研究过他们的异同,所以带着这个疑问探究一下System.Windows.Forms.Timer。System.Windows.Forms.Timer机制System.Windows.F......
  • .NET Core多线程 (1) Thread与Task
    去年换工作时系统复习了一下.NETCore多线程相关专题,学习了一线码农老哥的《.NET5多线程编程实战》课程,我将复习的知识进行了总结形成本专题。同时也特别推荐有兴趣的读者去学习一线码农老哥的《.NET5多线程编程》课程。本篇,我们来复习一下Thread与Task的相关知识点,预计阅读时......
  • SimpleDateFormat线程安全问题探究
    目录一.问题现象二.原因排查三.原因分析四.解决方案一.问题现象运营部门反馈使用小程序配置的拉新现金红包活动二维码,在扫码后跳转至404页面。二.原因排查1、首先,检查扫码后的跳转链接地址不是对应二维码的实际URL,根据代码逻辑推测,可能是accessToken在微信端已失效导致,检查数......
  • [async]子线程内开启协程 RuntimeError: There is no current event loop in thread '
    在子线程内直接获取事件循环会报错:RuntimeError:Thereisnocurrenteventloopinthread'Thread-2',此时的代码为:loop=asyncio.get_event_loop()loop.run_until_complete(协程函数) #执行解决方法:在子线程内创建并配置事件循环new_loop=asyncio.new_event_loop(......
  • 进程,线程和协程;为什么有了GIL锁还要互斥锁;多态和多态性;鸭子类型
    进程,线程和协程;为什么有了GIL锁还要互斥锁;多态和多态性;鸭子类型为什么有了GIL锁还要互斥锁1.GIL本身就是一个大的互斥锁2.同一个进程下资源是共享的,也就是说多条线程可以操作同一个变量3.多个线程可以操作同一个变量就会出现数据安全问题4.临界区:指一段代码或一段程序片段,需......