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生成随机数的方法
Jan 14 Python
python函数局部变量用法实例分析
Aug 04 Python
Python 基础教程之str和repr的详解
Aug 20 Python
Python 实现删除某路径下文件及文件夹的实例讲解
Apr 24 Python
Python开发网站目录扫描器的实现
Feb 21 Python
docker django无法访问redis容器的解决方法
Aug 21 Python
keras 获取某层输出 获取复用层的多次输出实例
May 23 Python
python 实现Harris角点检测算法
Dec 11 Python
利于python脚本编写可视化nmap和masscan的方法
Dec 29 Python
pycharm 使用tab跳出正在编辑的括号(){}{}等问题
Feb 26 Python
Python 实现绘制子图及子图刻度的变换等问题
May 31 Python
python机器学习实现oneR算法(以鸢尾data为例)
Mar 03 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
Yii使用find findAll查找出指定字段的实现方法
2014/09/05 PHP
浅谈php+phpStorm+xdebug配置方法
2015/09/17 PHP
php-fpm超时时间设置request_terminate_timeout资源问题分析
2019/09/27 PHP
利用浏览器全屏api实现js全屏
2014/01/16 Javascript
通过location.replace禁止浏览器后退防止重复提交
2014/09/04 Javascript
JavaScript模拟实现键盘打字效果
2015/06/29 Javascript
jQuery.each使用详解
2015/07/07 Javascript
基于zepto.js简单实现上传图片
2016/06/21 Javascript
jQuery实现根据滚动条位置加载相应内容功能
2016/07/18 Javascript
浅谈jquery中使用canvas的问题
2016/10/10 Javascript
微信小程序 图片边框解决方法
2017/01/16 Javascript
jQuery插件HighCharts绘制简单2D折线图效果示例【附demo源码】
2017/03/21 jQuery
对layui中表单元素的使用详解
2018/08/15 Javascript
JSON字符串操作移除空串更改key/value的介绍
2019/01/05 Javascript
微信小程序获取公众号文章列表及显示文章的示例代码
2020/03/10 Javascript
关于vue属性使用和不使用冒号的区别说明
2020/10/22 Javascript
vue+echarts+datav大屏数据展示及实现中国地图省市县下钻功能
2020/11/16 Javascript
vue实现两个区域滚动条同步滚动
2020/12/13 Vue.js
[05:02][DOTA2]DOTA进化论 第一期
2013/09/27 DOTA
python中enumerate函数用法实例分析
2015/05/20 Python
使用Python的Flask框架表单插件Flask-WTF实现Web登录验证
2016/07/12 Python
Python实现的人工神经网络算法示例【基于反向传播算法】
2017/11/11 Python
解决Python内层for循环如何break出外层的循环的问题
2019/06/24 Python
Python 使用 prettytable 库打印表格美化输出功能
2019/12/26 Python
使用TensorFlow直接获取处理MNIST数据方式
2020/02/10 Python
基于python调用jenkins-cli实现快速发布
2020/08/14 Python
澳大利亚游乐场设备品牌:Lifespan Kids
2019/05/24 全球购物
跟单文员的岗位职责
2013/11/14 职场文书
岗位职责范本
2013/11/23 职场文书
甜美蛋糕店创业计划书
2014/01/30 职场文书
小学语文教学反思
2014/02/10 职场文书
安全生产月宣传标语
2014/10/06 职场文书
关于群众路线的心得体会
2014/11/05 职场文书
浅谈Python响应式类库RxPy
2021/06/14 Python
Node.js实现断点续传
2021/06/23 Javascript
MySQL视图概念以及相关应用
2022/04/19 MySQL