设为首页 收藏本站
查看: 969|回复: 0

[经验分享] Python GIL(Global Interpreter Lock)

[复制链接]

尚未签到

发表于 2018-8-8 08:27:09 | 显示全部楼层 |阅读模式
三、GIL与多线程  有了GIL的存在,同一时刻同一进程中只有一个线程被执行
  进程可以利用多核,但是开销大,而python的多线程开销小,但却无法利用多核优势,要解决这个问题,我们需要在几个点上达成一致:
  1. cpu到底是用来做计算的,还是用来做I/O的?
  2. 多cpu,意味着可以有多个核并行完成计算,所以多核提升的是计算性能
  3. 每个cpu一旦遇到I/O阻塞,仍然需要等待,所以多核对I/O操作没什么用处
  一个工人相当于cpu,此时计算相当于工人在干活,I/O阻塞相当于为工人干活提供所需原材料的过程,工人干活的过程中如果没有原材料了,则工人干活的过程需要停止,直到等待原材料的到来。
  如果你的工厂干的大多数任务都要有准备原材料的过程(I/O密集型),那么你有再多的工人,意义也不大,还不如一个人,在等材料的过程中让工人去干别的活,
  反过来讲,如果你的工厂原材料都齐全,那当然是工人越多,效率越高
  结论:
  对计算来说,cpu越多越好,但是对于I/O来说,再多的cpu也没用
  当然对运行一个程序来说,随着cpu的增多执行效率肯定会有所提高(不管提高幅度多大,总会有所提高),这是因为一个程序基本上不会是纯计算或者纯I/O,所以我们只能相对的去看一个程序到底是计算密集型还是I/O密集型,从而进一步分析python的多线程到底有无用武之地。
  假设一种情况:
  现在有四个任务需要处理,处理方式是要有并发的效果,解决方案可以是:
  方案一:开启四个进程
  方案二:一个进程下,开启四个线程
  单核情况下,分析结果:
  如果四个任务是计算密集型,没有多核来并行计算,方案一徒增了创建进程的开销,方案二胜
  如果四个任务是I/O密集型,方案一创建进程的开销大,且进程的切换速度远不如线程,方案二胜
  多核情况下,分析结果:
  如果四个任务是计算密集型,多核意味着并行计算,在python中一个进程中同一时刻只有一个线程执行用不上多核,方案一胜
  如果四个任务是I/O密集型,再多的核也解决不了I/O问题,方案二胜
  结论:
  现在的计算机基本上都是多核,python对于计算密集型的任务开多线程的效率并不能带来多大性能上的提升,甚至不如串行(没有大量切换)
  但是,对于IO密集型的任务效率还是有显著提升的。
  四、多线程性能测试
  1、计算密集型:多进程效率高
  from multiprocessing import Process
  from threading import Thread
  import os,time
  def work():
  res=0
  for i in range(100000000):
  res*=i
  l=[]
  print(os.cpu_count()) #本机为4核
  start=time.time()
  for i in range(4):
  # p=Process(target=work) #耗时18s多
  p=Thread(target=work) #耗时26s多
  l.append(p)
  p.start()
  for p in l:
  p.join()
  stop=time.time()
  print('run time is %s' %(stop-start))
  2、i/o密集型:多线程效率高
  from multiprocessing import Process
  from threading import Thread
  import threading
  import os,time
  def work():
  time.sleep(2)
  print('===>')
  l=[]
  print(os.cpu_count()) #本机为4核
  start=time.time()
  for i in range(400):
  p=Process(target=work) #耗时4s多,大部分时间耗费在创建进程上
  # p=Thread(target=work) #耗时2s多
  l.append(p)
  p.start()
  for p in l:
  p.join()
  stop=time.time()
  print('run time is %s' %(stop-start))
  应用:
  多线程用于IO密集型,如socket,爬虫,web
  多进程用于计算密集型,如金融分析

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-548426-1-1.html 上篇帖子: Python入门教程(二) 下篇帖子: Python 学习笔记 - socketserver源代码剖析
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表