gil

协程课堂小结day31

我怕爱的太早我们不能终老 提交于 2019-12-02 06:40:49
昨日回顾 GIL全局解释锁 python解释器 Cpython(C语言编写) Jpython(Java编写) Ppython(Python编写) GIL全局解释锁 基于CPython来研究全局解释器锁,因为CPython的内存线程不是安全的 GIL本质上是一个互斥锁 GIL是为了阻止同一个进程内多个线程同时执行(并行) GIL的存在就是为了保证线程安全 注意:多个线程过来执行,一旦遇到IO操作,就会立马释放GIL解释器锁,交给下一个先进来的线程 多线程的作用 计算密集型程序 在单核情况下,若一个任务需要10s 开启进程,消耗资源大,执行4个进程需要40s 开启线程,消耗资源小,执行4个线程需要40s 在多核情况下,若一个任务需要10s 开启进程,并行执行,效率较高,执行4个进程需要10s 开启线程,并发执行,效率较低,执行4个线程需要40s IO密集型程序 在单核情况下,若一个任务需要10s 开启进程,消耗资源大,执行4个进程需要40s 开启线程,消耗资源小,执行4个线程需要40s 在多核情况下,若一个任务需要10s 开启进程,并行执行,效率小于线程,因为遇到IO会立即切换CPU执行权限,执行4个进程需要10s = 开启进程的额外时间 开启线程,并发执行,效率高于进程,执行4个线程需要40s 死锁现象 死锁是指两个或两个以上的进程或线程在执行过程中

day_31

感情迁移 提交于 2019-12-02 05:51:21
昨日回顾 GIL全局解释锁 python解释器 Cpython(C语言编写) Jpython(Java编写) Ppython(Python编写) GIL全局解释锁 基于CPython来研究全局解释器锁,因为CPython的内存线程不是安全的 GIL本质上是一个互斥锁 GIL是为了阻止同一个进程内多个线程同时执行(并行) GIL的存在就是为了保证线程安全 注意:多个线程过来执行,一旦遇到IO操作,就会立马释放GIL解释器锁,交给下一个先进来的线程 多线程的作用 计算密集型程序 在单核情况下,若一个任务需要10s 开启进程,消耗资源大,执行4个进程需要40s 开启线程,消耗资源小,执行4个线程需要40s 在多核情况下,若一个任务需要10s 开启进程,并行执行,效率较高,执行4个进程需要10s 开启线程,并发执行,效率较低,执行4个线程需要40s IO密集型程序 在单核情况下,若一个任务需要10s 开启进程,消耗资源大,执行4个进程需要40s 开启线程,消耗资源小,执行4个线程需要40s 在多核情况下,若一个任务需要10s 开启进程,并行执行,效率小于线程,因为遇到IO会立即切换CPU执行权限,执行4个进程需要10s = 开启进程的额外时间 开启线程,并发执行,效率高于进程,执行4个线程需要40s 死锁现象 死锁是指两个或两个以上的进程或线程在执行过程中

Python GIL全局解释器锁

独自空忆成欢 提交于 2019-12-02 05:38:10
GIL解释: GIL:Global Interpreter Lock 全局解释器锁,设计目的是保证数据安全。 GIL 的功能是:在 CPython 解释器中执行的每一个 Python 线程,都会先锁住自己,以阻止别的线程执行。也就是说在解释器执行任何Python代码时,都需要先获取这把锁,意味着 任何时候只可能有一个线程在执行代码,其他线程要想获得CPU去执行代码,就必须等到占有该锁的线程释放锁才有执行的可能。 当然Python中不会让一个线程一直独占解释器,它会轮流执行 Python 线程,即 Python 线程在交替执行,来模拟真正并行的线程(伪并行),但 Python中每次释放GIL锁,线程进行锁竞争、切换线程,都会造成资源消耗, 并且由于GIL锁存在,python里一个进程永远只能同时执行一个线程(拿到GIL的线程才能执行) ,导致在多核CPU上,Python的多线程效率并不高。 如果所示,三个线程交替执行,借此模拟并行。但某一时刻,程序中只有一个线程在执行,其他线程在等待其释放锁。 GIL 的特点: 1. Python在多线程下,每个线程的执行方式为: 获取GIL 执行代码直到sleep或者是python虚拟机将其挂起。 释放GIL 2. 一个CPU只能执行一个线程 ,例如一个CPU 有三个线程 ,首先线程A执行 ,然后 线程A达到释放条件进行释放GIL,线程B 和线程C

深入理解Python中的GIL(全局解释器锁)

自作多情 提交于 2019-12-02 05:13:13
深入理解Python中的GIL(全局解释器锁) Python是门古老的语言,要想了解这门语言的多线程和多进程以及协程,以及明白什么时候应该用多线程,什么时候应该使用多进程或协程,我们不得不谈到的一个东西是Python中的GIL(全局解释器锁)。这篇我们就来看看这个GIL究竟是怎么回事。 1. GIL是什么? 首先来看看GIL究竟是什么。我们需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码。有名的编译器例如GCC,INTEL C++,Visual C++等。Python也一样,同样一段代码可以通过CPython,PyPy,Psyco等不同的Python执行环境来执行。像其中的JPython就没有GIL。然而因为CPython是大部分环境下默认的Python执行环境。所以在很多人的概念里CPython就是Python,也就想当然的把GIL归结为Python语言的缺陷。所以这里要先明确一点:GIL并不是Python的特性,Python完全可以不依赖于GIL。 那么CPython实现中的GIL又是什么呢?GIL全称Global Interpreter Lock为了避免误导,我们还是来看一下官方给出的解释: In CPython, the global

python的GIL锁

荒凉一梦 提交于 2019-12-02 03:48:13
进程:系统运行的一个程序,是系统分配资源的基本单位。 线程:是进程中执行运算的最小单位,是处理机调度的基本单位。 处理机:是计算机中存储程序和数据,并按照程序规定的步骤执行指令的部件。包括中央处理器、主存储器、I/O接口。 程序:程序是描述处理机完成某任务的指令序列。 指令:处理机能够解释、直接执行的信息单位。 计算机系统:处理机+外围设备。 并行:多个cpu同时执行多个任务,假设有两个程序,这两个程序在两个不同的cpu上同时运行。 并发:单个cpu交替执行多个任务,假设有两个程序,这两个在该cpu上交替进行运行,而不是同时运行,只是由于执行的时间太快,让人误以为是在“同时进行”。执行的先后取决于对时间片资源的竞争。其中两种并发关系是同步和互斥。 同步: 不是指同时进行 , 指线程之间按一定 顺序 进行运行,当前一个线程结束时,下一个线程才能够运行。 异步:线程不可以同时进行运行。 (1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位。 (2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。 (3)处理机分给线程,即真正在处理机上运行的是线程

day30 GIL

元气小坏坏 提交于 2019-12-02 03:40:34
GIL全局解释器锁 python解释器: ​ 1.Cpython ​ 2.Jpython ​ 3.Ppython GIL全局解释器锁 基于Cpython来研究全局解释器锁 ​ 1.GIL本质上是一个互斥锁 ​ 2.GIL为了阻止同一个进程内多个线程同时执行(并行) ​ -单个进程下的多个线程无法实现并行,但是能实现并发 ​ 3.这把锁主要是因为Cpython的内存管理不是‘线程安全’的 ​ -内存管理 ​ -垃圾回收机制 ​ GIL的存在就是未来了保证线程安全的 ​ 注意:多个线程过来执行,一旦遇到IO操作,就会立马释放GIL解释器锁,交给下一个先进来的线程 import time from threading import Thread,current_thread number=100 def task(): global number number2=number # time.sleep(1) number=number2-1 print(number,current_thread().name) for line in range(10): t=Thread(target=task) t.start() '''99 Thread-1 98 Thread-2 97 Thread-3 96 Thread-4 95 Thread-5 94 Thread-6 93 Thread

GIL全局解释器锁

僤鯓⒐⒋嵵緔 提交于 2019-12-02 03:32:05
‘’‘ 1.GIL全局解释器锁: 1.GIL是Cpython特有的。 2.GIL本质上是一个互斥锁. 3.GIL的为了阻止同一个进程内多个线程同时执行(并行) - 单个进程下的多个线程无法实现并行,但能实现并发 4.这把锁主要是因为CPython的内存管理不是 "线程安全" 的. - 保证线程在执行任务时不会被垃圾回收机制回收。 2.GIL存在的目的: GIL的存在就是为了保证线程安全的. 注意: 多个线程过来执行,一旦遇到IO操作,就会立马释放GIL解释器锁,交给下一个先进来的线程. 3.何时使用多进程或多线程? - 在计算密集型的情况下: - 使用多进程 - 在IO密集型的情况下: - 使用多线程 - 高效执行多个进程,内多个IO密集型的程序: - 使用 多进程 + 多线程 - ''' 4.服务端实现并发 import socket from threading import Thread import time """ 服务端: 1.有固定的IP和PORT 2.24小时不间断提供服务 3.能够支持并发 """ server = socket.socket() server.bind(( '127.0.0.1', 9550 )) server.listen(5) print('启动服务端。。。') def working(conn): while True: try: data

day30 学习小结

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-02 03:30:12
目录 一、GIL全局解释器锁 1. GIL是什么? 2. GIL有什么用? 3. 为什么要有GIL? 二、多线程的作用 三、死锁现象 四、递归锁 五、信号量 六、线程队列 一、GIL全局解释器锁 1. GIL是什么? GIL本质上是一个互斥锁。 2. GIL有什么用? GIL的作用是阻止同一个进程内多个线程同时执行(并行)。 单个进程下的多个进程无法实现并行,但能实现并发。 3. 为什么要有GIL? GIL锁可以使内存管理是“数据安全”的。 GIL的存在就是为了保证线程安全。 注意:多个线程过来执行,一旦遇到IO操作,就会立马释放GIL解释器锁,把锁教给下一个线程使用。 二、多线程的作用 不同的任务有不同的特性,有的属于计算密集型,有的属于IO密集型,对于不同的任务而言,使用进程还是使用线程会对CPU的使用效率造成极大的差别。 结论: 在计算密集型的情况下: 使用多进程 在IO密集型的情况下: 使用多线程 高效执行多个进程,内多个IO密集型的程序: 使用 多进程 + 多线程 ''' - 四个任务, 计算密集型, 每个任务需要10s: 单核: - 开启进程 消耗资源过大 - 4个进程: 40s - 开启线程 消耗资源远小于进程 - 4个线程: 40s 多核: - 开启进程 并行执行,效率比较高 - 4个进程: 10s - 开启线程 并发执行,执行效率低. - 4个线程: 40s -

10.23GIL全局解释器锁,多线程作用,死锁,递归锁,信号量

蹲街弑〆低调 提交于 2019-12-02 03:20:19
python解释器 cpython C写的 ppython python写的 jpython java写的 GIL全局解释器锁 基于Cpython来研究全局解释器锁 GIL本质上是一个互斥锁 GIL为了阻止同一个进程内多个线程同时执行一个代码 单个进程下的多个线程无法实现并行,但能时间并发 主要是因为cpython的内存管理不是保证线程安全的 内存管理 垃圾回收机制 GIL的存在是为了保证线程安全的 注意:多个线程过来执行,一旦遇到IO操作,就会立马释放GIL解释器锁,交给下一个先进去的线程 多线程的作用 4个任务,每个任务10秒 计算密集型 单核 开启进程: 消耗资源大 4个进程:是40秒 开启线程: 消耗资源院校以进程 4个线程:是40秒 多核 开启进程: 并行,执行效率高 4个进程:是10秒 开启线程: 执行效率低 4个线程:是40秒 IO密集型 单核 开启进程: 消耗资源大 4个进程:是40秒 开启线程: 消耗资源院校以进程 4个线程:是40秒 多核 开启进程: 并行,执行效率低于多线程,因为遇见IO会立马切换CPU的执行权限 4个进程:是40秒+额外开启进程消耗的时间 开启线程: 并发执行,执行效率高于多进程 4个线程:是40秒 在计算密集型的情况下 使用多进程 IO密集型的情况下 使用多线程 高效执行,多个进程内有多个IO密集型的程序 使用多进程+多线程 死锁现象

GIL全局解释器锁死锁递归锁信号量

杀马特。学长 韩版系。学妹 提交于 2019-12-02 03:07:33
目录 GIL全局解释器锁 注意: 多线程的作用: 死锁现象和递归锁 注意 信号量 线程队列 FIFO队列: LIFO队列: 优先级队列 GIL全局解释器锁 GIL全局解释器锁:基于cpython来研究解释器锁 GIL本质上是一个互斥锁 GIL的目的是为了阻止同一个进程内多个线程同时执行(并发) 单个进程下的多个线程无法实现并行,但是能实现并发 这把锁主要是因为cpython的内存管理不是“线程安全”的 内存管理: 垃圾回收机制 GIL的存在就是为了保证线程的安全 注意: 多个线程过来执行,一旦遇到io操作,就会立马释放GIL解释锁,交给下一个先进来的线程 多线程的作用: 站在两个角度看问题 ''' 四个任务计算密集型,每个任务需要10s: 单核: 开启进程: 消耗资源过大 4个进程:40s 开启线程: 消耗资源远小于进程 4个线程:40s 多核: 开启进程 并行执行,效率比较高 4个进程: 10s 开启线程 并发执行,执行效率低. 4个线程: 40s 四个任务, IO密集型, 每个任务需要10s: 单核: 开启进程 消耗资源过大 4个进程: 40s 开启线程 消耗资源远小于进程 4个线程: 40s 多核: 开启进程 并行执行,效率小于多线程,因为遇到IO会立马切换CPU的执行权限 4个进程: 40s + 开启进程消耗的额外时间 开启线程 并发执行,执行效率高于多进程 4个线程: