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数据类型详解(四)字典:dict
May 12 Python
python如何定义带参数的装饰器
Mar 20 Python
opencv python 图像去噪的实现方法
Aug 31 Python
python requests爬取高德地图数据的实例
Nov 10 Python
对web.py设置favicon.ico的方法详解
Dec 04 Python
Python从列表推导到zip()函数的5种技巧总结
Oct 23 Python
详解Django配置优化方法
Nov 18 Python
python实现logistic分类算法代码
Feb 28 Python
python 输入字符串生成所有有效的IP地址(LeetCode 93号题)
Oct 15 Python
如何用Python和JS实现的Web SSH工具
Feb 23 Python
你喜欢篮球吗?Python实现篮球游戏
Jun 11 Python
关于Python OS模块常用文件/目录函数详解
Jul 01 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版
2006/10/09 PHP
php删除字符串末尾子字符,删除开始字符,删除两端字符(实现代码)
2013/06/27 PHP
探讨:web上存漏洞及原理分析、防范方法
2013/06/29 PHP
PHP静态文件生成类实例
2014/11/29 PHP
php微信开发之自定义菜单完整流程
2016/10/08 PHP
PHP检测一个数组有没有定义的方法步骤
2019/07/20 PHP
php实现简单四则运算器
2020/11/29 PHP
基于jQuery的表格操作插件
2010/04/22 Javascript
jQuery实现可拖动的浮动层完整代码
2013/05/27 Javascript
JavaScript的事件绑定(方便不支持js的时候)
2013/10/01 Javascript
JS实现常见的TAB、弹出层效果(TAB标签,斑马线,遮罩层等)
2015/10/08 Javascript
jQuery判断checkbox选中状态
2016/05/12 Javascript
jQuery下拉框的简单应用
2016/06/24 Javascript
layui分页效果实现代码
2017/05/19 Javascript
js实现图片区域可点击大小随意改变(适用移动端)代码实例
2019/09/11 Javascript
JavaScript复制变量三种方法实例详解
2020/01/09 Javascript
js实现弹幕飞机效果
2020/08/27 Javascript
解决vue项目打包上服务器显示404错误,本地没出错的问题
2020/11/03 Javascript
js重写alert事件(避免alert弹框标题出现网址)
2020/12/04 Javascript
使用相同的Apache实例来运行Django和Media文件
2015/07/22 Python
对tf.reduce_sum tensorflow维度上的操作详解
2018/07/26 Python
Pytorch数据拼接与拆分操作实现图解
2020/04/30 Python
浅谈keras.callbacks设置模型保存策略
2020/06/18 Python
什么是python的函数体
2020/06/19 Python
python3获取控制台输入的数据的具体实例
2020/08/16 Python
简述python Scrapy框架
2020/08/17 Python
利用Python的folium包绘制城市道路图的实现示例
2020/08/24 Python
python dir函数快速掌握用法技巧
2020/12/09 Python
付款委托书范本
2014/04/04 职场文书
分公司负责人任命书
2014/06/04 职场文书
民族学专业职业生涯规划范文:积跬步以至千里
2014/09/11 职场文书
机关干部个人对照检查材料思想汇报
2014/09/28 职场文书
时尚女魔头观后感
2015/06/04 职场文书
html5表单的required属性使用
2021/07/07 HTML / CSS
分位数回归模型quantile regeression应用详解及示例教程
2021/11/02 Python
numpy array找出符合条件的数并赋值的示例代码
2022/06/01 Python