GIL锁和进程/线程池】的更多相关文章

GIL锁 1.GIL锁 全局解释器锁,就是一个把互斥锁,将并发变成串行,同一时刻只能有一个线程使用共享资源,牺牲效率,保证数据安全,也让程序员避免自己一个个加锁,减轻开发负担 带来的问题 感觉单核处理IO阻塞的多线程,与多核处理IO阻塞的多线程效率差不多,实际上由于cpu遇到IO问题会将线程挂起,切换到其他线程,多出的时间仅仅是多在切换的时间,两者效率差不多 多核的前提下:如果任务IO密集型,多线程并发,避免开进程占用资源,若果是任务计算密集型:多进程并发,可充分利用多核优势 2.普通的Lock…
1.死锁 定义; 类似两个人分别被囚禁在两间房子里,A手上拿着的是B囚禁房间的钥匙,而B拿着A的钥匙,两个人都没法出去,没法给对方开锁,进而造成死锁现象.具体例子代码如下: # -*-coding:utf-8 -*- from threading import Thread,Lock,RLock import time muxeA=Lock() muxeB=Lock() class MyThread(Thread): def run(self): self.func1() self.func2(…
1.什么是GIL? 官方解释: ''' In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe. (Howe…
一.GIL全局解释器锁 全局解释器锁 在CPython中,全局解释器锁(GIL)是一个互斥锁,它可以防止多个本机线程同时执行Python代码.之所以需要这个锁,主要是因为CPython的内存管理不是线程安全的.(然而,自从GIL存在以来,其他特性已经逐渐依赖于它所执行的保证) 什么是GIL 全局解释器锁, 施加在解释器上的互斥锁 为什么需要GIL 由于CPython的内存管理时非线程安全,于是CPython就给解释器加上锁, 解决了安全问题. GIL的加锁与解锁时机 加锁的时机: 在调用解释器时…
一.进程/线程池 1.进程池 (1)什么是进程池 如果需要创建的子进程数量不大,可以直接利用multiprocess中的Process来创建.但是当需要创建上百个或上千个,手动创建就较为繁琐,这时就可以利用进程池来创建,即current.futures模块中的ProcessPoolExecutor (2)ProcessPoolExecutor的基本方法 1. submit(fn,*args,**kwargs) # 异步提交任务 2. map(func, *iterables, timeout=N…
进程/线程池.协程.gevent第三方库 一.进程/线程池 1.进程池 (1)什么是进程池 如果需要创建的子进程数量不大,可以直接利用multiprocess中的Process来创建.但是当需要创建上百个或上千个,手动创建就较为繁琐,这时就可以利用进程池来创建,即current.futures模块中的ProcessPoolExecutor (2)ProcessPoolExecutor的基本方法 1. submit(fn,*args,**kwargs) # 异步提交任务 2. map(func,…
GIL锁定义 GIL锁:Global Interpreter Lock  全局解释器 本质上是一把互斥锁 官方解释: 在CPython中,这个全局解释器锁,也称为GIL,是一个互斥锁,防止多个线程在同一时间执行Python字节码, 这个锁是非常重要的,因为CPython的内存管理是非线程安全的,也有很多其他的特性依赖于GIL(比如有些 东西是依赖这个GIL写好的,要替换成本很高),所以即使它影响了程序的效率,也无法直接将其去除. 需要知道的是,解释器并不只有CPython,还有PyPy,Jpyt…
###############总结############ 线程创建的2种方式(重点) 进程:资源分配单位    线程:cpu执行单位(实体) 线程的创建和销毁的开销特别小 线程之间资源共享,是同一个进程中的资源共享,会涉及到安全问题,所以需要加锁解决 锁:牺牲了效率,保证了数据安全(重点) 死锁现象:出现在嵌套的时候,双方互相抢对方已经拿到的锁,导致双方互相等待(重点) 递归锁: 解决了死锁现象(重点) rlock 首先本身就是个互斥锁,维护了一个计数器,每次acquire+1,release…
目录 昨日回顾 GIL全局解释器锁 计算密集型和IO密集型 死锁现象 递归锁 信号量 线程队列 FOFI队列 LIFO队列 优先级队列 今日内容 Event事件 线程池与进程池 异步提交和回调函数 协程 yiled gevent模块 昨日回顾 GIL全局解释器锁 本质上是互斥锁 Cpython才有的 同一个进程下开启多个线程,让并发变成串行,保证线程安全 计算密集型和IO密集型 计算密集型 使用多进程 IO密集型 使用多线程 死锁现象 两个锁在两个或多个线程或进程中被相互调用,从而陷入相互等待的…
1:锁(Lock) 1.1       java提供了一个锁的接口,这个锁同样可以达到同步代码块的功能,API文档上说使用锁比使用synchronized更加灵活. 1.2       如何使用这个“锁” //1.创建一个所对象,我们可以理解为写一个synchronized代码块 public static Lock lock = new ReentrantLock();//用lock的一个子类去创建 //2.假设有某程序中使用两把锁,这两把锁是类似于synchronized里的锁 //要使用到…