day35

一丶GIL锁

什么是GIL锁:

   存在Cpython解释器,全名:全局解释器锁.(解释器级别的锁)

​   GIL是一把互斥锁,将并发运行变成串行.

​   在同一个进程下开启的多个线程,同时只能有一个线程执行,无法利用多核优势

GIL锁的作用:

​   保证同一时间内,共享数据只能被一个任务修改.保证数据的完整性和安全性

​   自动上锁和解锁,不需要人为的添加.减轻开发人员的负担

所谓诟病:单进程的多线程不能利用多核

   通常有人会认为GIL锁不能利用多核处理任务,是Python语言的诟病.个人认为任何一门语言都不是完美的,python问世于20世纪末,当时的CPU也只是单核.

   So,不能利用多核的原因是:同一个进程下,只允许一个线程对共享内容进行修改.不允许多线程同时处理共享数据.

   (打个比方:现在你家有10升(共享数据:10)牛掰的牛奶,你免费送给大家每人1升. 现在有100个人(100个线程)知道了这件事,都上你家来取奶.肯定谁先来,先得. 现在来了10个人(10个线程),每个人都说我去了1升,还剩9升.你真的还剩9升吗? 毛线~~ ,你球都不剩了. 后面来的90个人还能拿到奶吗? 肯定拿拿不到了. So你是不是得上锁,比如你家大门就是一把锁.每次只允许进来(上锁)1个人去奶.取完之后把总的奶量 减一. 第一个取完了出了大门(解锁).剩余的99个人开始抢着进你家门,公平竞争,谁先到你家门,先进就把门锁上了此时发现奶的数量还剩9升,第二个人也只取1升....往后依次延续,当第十一个人进来时,肯定奶已经没了.就表示数据为0.不能再取奶.保证奶的数量的安全性,和完整性(这还是装奶的容器))

GIL抽象图:

   黑色方框就代表GIL锁

二丶验证Cpython的并发效率

需求:

   现在有4个任务(计算密集型任务 或者 IO密集型任务)需要处理.

方案:

   一.开启四个进程

​   二.开启一个进程,四个线程

结果:

   单核:

​      IO密集型:开启进程开销大,进程切换速度远不如线程. 采用一个进程四个线程方案

      计算密集型:没有多核来并行计算,徒增创建进程时间,采用一个进程四个线程方案

   多核:

      IO密集型:尽管多核,开启进程也比较耗时,而且还是要不断的切换.不如线程快.采用一进四线方案

      计算密集型:多核,开启进程并行计算.此时如果用四个线程来会切换回损耗时间.采用四进程方案

多核处理计算密集型:

   多进程的并行执行 单进程的多线程 效率高

  1. # -*-coding:utf-8-*-
  2. # Author:Ds
  3. ### 计算密集型
  4. #开启四个进程 , 开启四个线程
  5. from multiprocessing import Process
  6. from threading import Thread
  7. import time
  8. import os
  9. def task1():
  10. res=1
  11. for i in range(1,100000000):
  12. res+=i
  13. def task2():
  14. res=1
  15. for i in range(1,100000000):
  16. res+=i
  17. def task3():
  18. res=1
  19. for i in range(1,100000000):
  20. res+=i
  21. def task4():
  22. res=1
  23. for i in range(1,100000000):
  24. res+=i
  25. if __name__ == '__main__':
  26. start_time=time.time()
  27. ### 多核四进程: 处理计算密集型任务,效率高
  28. # 开启四个进程
  29. # p1=Process(target=task1,) # 6.557461261749268
  30. # p2=Process(target=task2,)
  31. # p3=Process(target=task3,)
  32. # p4=Process(target=task4,)
  33. ### 虽然本人计算机是多核,但是由于GIL所的原因,同一时刻只允许一个线程处理任务
  34. ### 一进程四线程: 处理计算密集型任务,效率低
  35. #开启四个线程
  36. p1=Thread(target=task1,) # 22.048070430755615
  37. p2=Thread(target=task2,)
  38. p3=Thread(target=task3,)
  39. p4=Thread(target=task4,)
  40. p1.start()
  41. p2.start()
  42. p3.start()
  43. p4.start()
  44. p1.join()
  45. p2.join()
  46. p3.join()
  47. p4.join()
  48. print(f'主:{time.time()-start_time}')
  49. #### 总结:
  50. #计算密集型: 多进程的并行执行 ~比~ 单进程的多线程 效率高

多核处理IO密集型:

   任务是IO密集型并且任务数量很大,用单进程下的多线程效率高.

  1. from multiprocessing import Process
  2. from threading import Thread
  3. import time
  4. import os
  5. def task1():
  6. res=1
  7. time.sleep(3)
  8. if __name__ == '__main__':
  9. start_time=time.time()
  10. ### 并行处理 四核 开启一个进程,使用一个CPU
  11. # 开启进程需要耗费大量时间
  12. # l_t=[]
  13. # for i in range(150):
  14. # ### 多进程处理IO密集型
  15. # p=Process(target=task1) # 耗时: 9.513447999954224
  16. # l_t.append(p)
  17. # p.start()
  18. #
  19. # for j in l_t:
  20. # j.join()
  21. ### 并发处理
  22. #虽然是并发处理 ,但是会在CPU之间来回切换.提高效率
  23. l_t = []
  24. for i in range(150):
  25. ### 多线程处理IO密集型
  26. p = Thread(target=task1) # 耗时: 3.0212857723236084
  27. l_t.append(p)
  28. p.start()
  29. for j in l_t:
  30. j.join()
  31. print(f'主:{time.time()-start_time}')
  32. #### 总结:
  33. #IO密集型: 任务是IO密集型并且任务数量很大,用单进程下的多线程效率高.

三丶GIL与互斥锁的关系

GIL vs ThreadLock:

​   GIL保护的是解释器级的数据,自动上锁,自动解锁.

   Lock是保护用户自己的数据,手动上锁,手动解锁.如下图:

Python进阶----GIL锁,验证Cpython效率(单核,多核(计算密集型,IO密集型)),线程池,进程池的更多相关文章

  1. Python并发编程05 /死锁现象、递归锁、信号量、GIL锁、计算密集型/IO密集型效率验证、进程池/线程池

    Python并发编程05 /死锁现象.递归锁.信号量.GIL锁.计算密集型/IO密集型效率验证.进程池/线程池 目录 Python并发编程05 /死锁现象.递归锁.信号量.GIL锁.计算密集型/IO密 ...

  2. Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就绪,挂起,运行) ,***协程概念,yield模拟并发(有缺陷),Greenlet模块(手动切换),Gevent(协程并发)

    Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就 ...

  3. GIL 线程池 进程池 同步 异步 阻塞 非阻塞

    1.GIL 是一个全局解释器锁,是一种互斥锁 为什么需要GIL锁:因为一个python.exe进程中只有一份解释器,如果这个进程开启了多个线程都要执行代码 多线程之间要竞争解释器,一旦竞争就有可能出现 ...

  4. GIL 线程池 进程池 同步 异步

    1.GIL(理论 重点)2.线程池 进程池3.同步 异步 GIL 是一个全局解释器锁,是一个互斥锁 为了防止竞争解释器资源而产生的 为何需要gil:因为一个python.exe进程中只有一份解释器,如 ...

  5. Python并发编程之线程池/进程池--concurrent.futures模块

    一.关于concurrent.futures模块 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/ ...

  6. 《转载》Python并发编程之线程池/进程池--concurrent.futures模块

    本文转载自Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mult ...

  7. 并发编程~~~多线程~~~计算密集型 / IO密集型的效率, 多线程实现socket通信

    一 验证计算密集型 / IO密集型的效率 IO密集型: IO密集型: 单个进程的多线程的并发效率高. 计算密集型: 计算密集型: 多进程的并发并行效率高. 二 多线程实现socket通信 服务器端: ...

  8. Python并发编程之线程池&进程池

    引用 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/销毁进程或者线程是非常消耗资源的,这个时候我 ...

  9. Python进阶:GIL(全局解释器锁)

    一个不解之谜 一段代码 def CountDown(n): while n > 0: n -= 1 # CountDown(100000000) #==8秒 from threading imp ...

随机推荐

  1. 强烈建议为你的Android项目加上 largeHeap 属性

    小内存机器使用“微信”时,看视频经常崩溃(out of memory) ,小内存机器有时候明明内存还很多,却还是抛出“内存不够”,应该就是每个APP能用“堆大小”的限制. 如上图,Android项目的 ...

  2. 微信小程序公共方法创建与调用

        在根节点建个 utils  文件夹,在文件夹下建立 util.js   在util.js里面写入 var util = {}; util.getUserId= function(e, t) { ...

  3. SpringBoot——配置文件加载位置及外部配置加载顺序

    声明 本文部分转自:SpringBoot配置文件加载位置与优先级 正文 1. 项目内部配置文件 spring boot 启动会扫描以下位置的application.properties或者applic ...

  4. 基于redis5的session共享:【redis 5.x集群应用研究】

    基于springsession构建一个session共享的模块. 这里,基于redis的集群(Redis-5.0.3版本),为了解决整个物联网平台的各个子系统之间共享session需求,且方便各个子系 ...

  5. Scrapy爬虫Demo 爬取资讯分类

    爬取新浪网导航页所有下所有大类.小类.小类里的子链接,以及子链接页面的新闻内容. 效果演示图: items.py import scrapy import sys reload(sys) sys.se ...

  6. React.lazy和React.Suspense异步加载组件

    在React16.6中引入了React.lazy和React.Suspense,这两个组件,可以用来实现异步加载组件. 例如: const johanComponent = React.lazy(() ...

  7. awk(gawk)文本报告生成器

    awk是gawk的链接文件,是一种优良的文本处理工具,实现格式化文本输出,是Linux和Unix现有环境中功能最强大的数据处理引擎之一.这种编程及数据操作语言的最大功能取决于一个人拥有的知识量,使用& ...

  8. CKA认证简介

  9. linux 下mysql 关闭 启动

    一. 启动 .使用 service 启动:service mysql start .使用 mysqld 脚本启动:/etc/init.d/mysql start .使用 safe_mysqld 启动: ...

  10. 【计算机视觉】OpenCV篇(10) - 模式识别中的模板匹配

    什么是模式识别? 它指的是,对表征事物或现象的各种形式的信息进行处理和分析,从而达到对事物或现象进行描述.辨认.分类和解释的目的. 我们之所以可以很快辨别猫是猫.O不是0,就是因为在我们大脑中已经给猫 ...