python如何支持并发方法详解


Posted in Python onJuly 25, 2020

由于GIL(Global Interpreter Lock)的存在使得在同一时刻Python进程只能使用CPU的一个核心,也就是对应操作系统的一个
内核线程,对于一个Python web程序,如果有个请求,并且都是长耗时的计算任务(占用),这个程序在接受第一个请求后
还能处理别的请求么?假如web程序接受到请求就while True了:

def handle_request(request):
 while True:
  pass

从代码上理解,Python只有一个真正的执行线程,代码走到while True就占用唯一的一个cpu核心了,它还有机会处理
别的任务么?

来启动两个线程都进行while True ,观察他们是否都能执行来模拟那两个请求:

import time, threading

def f1(name):
 while True:
  print(name)
  time.sleep(1)

threading.Thread(target=f1, args=('f1', )).start()
threading.Thread(target=f1, args=('f2', )).start()

输出结果:

f1
f2
f2f1

f2
f1
...

实际上使用Django(一个Python Web 框架)测试,即使一个请求执行了while True这样的代码,它还是可以处理别的请求(支持并发);

来解释一下为什么两个while True 都能执行:
还是用GIL这把锁,第一个while True的线程拿到这把锁才能执行,然后它执行了一个print(name)接着把锁释放了,
它就暂停了,接着第二个while True线程拿到GIL后开始执行,围绕GIL交替执行,就实现了Python的多线程。

总结一下:

while True也不能一直持有CPU资源,它也是执行一会歇一会,这就给了其他进程机会,这里面有两个关键点:

  • 如何抢到这把锁
  • 如何释放锁

抢锁,排队。给lock安排一个队列,想执行的进这个队列。

释放锁的有点类似进程调度:

  • 划分时间片(执行一样的时间)
  • 执行指令计数(执行一样的指令次数)
  • 碰到IO操作(被动等待)
  • 主动等待(wait/join/sleep)

碰到IO操作,需要等待IO设备完成计算才能继续执行线程,这段时间内不占用CPU资源,先把锁释放了。
主动等待,典型的就是sleep,主动放弃锁,等到一定时机再重新执行。

以上分析 说明Python支持并发,但是由于无法利用多核处理器优势,对于大量并发下的计算密集型应用
不适合使用Python。

到此这篇关于python如何支持并发的文章就介绍到这了,更多相关python支持并发内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
跟老齐学Python之不要红头文件(2)
Sep 28 Python
python判断字符串编码的简单实现方法(使用chardet)
Jul 01 Python
Python打包文件夹的方法小结(zip,tar,tar.gz等)
Sep 18 Python
Python json 错误xx is not JSON serializable解决办法
Mar 15 Python
python实现各进制转换的总结大全
Jun 18 Python
python-opencv 将连续图片写成视频格式的方法
Jan 08 Python
Python3.5以上版本lxml导入etree报错的解决方案
Jun 26 Python
python3.x+pyqt5实现主窗口状态栏里(嵌入)显示进度条功能
Jul 04 Python
Tensorflow读取并输出已保存模型的权重数值方式
Jan 04 Python
pycharm激活码快速激活及使用步骤
Mar 12 Python
基于Django OneToOneField和ForeignKey的区别详解
Mar 30 Python
解析python中的jsonpath 提取器
Jan 18 Python
Python获取浏览器窗口句柄过程解析
Jul 25 #Python
用Python 爬取猫眼电影数据分析《无名之辈》
Jul 24 #Python
基于Python实现简单学生管理系统
Jul 24 #Python
用python实现学生管理系统
Jul 24 #Python
Python 解析简单的XML数据
Jul 24 #Python
深入了解NumPy 高级索引
Jul 24 #Python
python实现学生管理系统开发
Jul 24 #Python
You might like
php 删除记录实现代码
2009/03/12 PHP
php线性表的入栈与出栈实例分析
2015/06/12 PHP
Three.js源码阅读笔记(基础的核心Core对象)
2012/12/27 Javascript
js为空或不是对象问题的快速解决方法
2013/12/11 Javascript
JS实现的表格操作类详解(添加,删除,排序,上移,下移)
2015/12/22 Javascript
jQuery动画效果图片轮播特效
2016/01/12 Javascript
JS创建对象几种不同方法详解
2016/03/01 Javascript
KnockoutJS 3.X API 第四章之表单textInput、hasFocus、checked绑定
2016/10/11 Javascript
Bootstrap和Java分页实例第二篇
2016/12/23 Javascript
浅析bootstrap原理及优缺点
2017/03/19 Javascript
利用yarn代替npm管理前端项目模块依赖的方法详解
2017/09/04 Javascript
React Native悬浮按钮组件的示例代码
2018/04/05 Javascript
koa上传excel文件并解析的实现方法
2018/08/09 Javascript
Three.js实现简单3D房间布局
2018/12/30 Javascript
基于JS实现web端录音与播放功能
2019/04/17 Javascript
过滤器vue.filters的使用方法实现
2019/09/18 Javascript
Vuex,iView UI面包屑导航使用扩展详解
2019/11/04 Javascript
vue实现pdf文档在线预览功能
2019/11/26 Javascript
Python 中的range(),以及列表切片方法
2018/07/02 Python
python3.5基于TCP实现文件传输
2020/03/20 Python
python运用pygame库实现双人弹球小游戏
2019/11/25 Python
pycharm 2019 最新激活方式(pycharm破解、激活)
2020/09/22 Python
意大利网上药房:Farmacia 33
2020/01/27 全球购物
JSF面试题:Jsf中的核心类用那些?有什么作用?LiftCycle六大生命周期是什么?
2014/07/17 面试题
药品业务员岗位职责
2014/04/17 职场文书
群众路线班子对照检查材料
2014/09/25 职场文书
银行会计主管岗位职责
2014/10/01 职场文书
用人单位聘用意向书
2015/05/11 职场文书
2016感恩父亲节主题广播稿
2015/12/18 职场文书
初中信息技术教学反思
2016/02/16 职场文书
22句经典语录:送给优柔寡断和胡思乱想的朋友们
2019/12/13 职场文书
Java中使用Filter过滤器的方法
2021/06/28 Java/Android
Python的三个重要函数详解
2022/01/18 Python
斗罗大陆八大特殊魂兽,龙族始祖排榜首,第五最残忍(翠魔鸟)
2022/03/18 国漫
Android超详细讲解组件ScrollView的使用
2022/03/31 Java/Android
CI Games宣布《堕落之王2》使用虚幻引擎5制作 预计将于2023年正式发售
2022/04/11 其他游戏