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使用新浪微博API发送微博的例子
Apr 10 Python
Python中使用select模块实现非阻塞的IO
Feb 03 Python
修改Python的pyxmpp2中的主循环使其提高性能
Apr 24 Python
python3.4下django集成使用xadmin后台的方法
Aug 15 Python
Python 私有函数的实例详解
Sep 11 Python
python实现简易云音乐播放器
Jan 04 Python
Python实用技巧之利用元组代替字典并为元组元素命名
Jul 11 Python
Python minidom模块用法示例【DOM写入和解析XML】
Mar 25 Python
Centos7 下安装最新的python3.8
Oct 28 Python
基于python SMTP实现自动发送邮件教程解析
Jun 02 Python
Python JSON常用编解码方法代码实例
Sep 05 Python
Python实现Appium端口检测与释放的实现
Dec 31 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利用APC模块实现大文件上传进度条的方法
2015/10/29 PHP
Yii调试查看执行SQL语句的方法
2016/07/15 PHP
PHP搭建大文件切割分块上传功能示例
2017/01/04 PHP
Javascript注入技巧
2007/06/22 Javascript
在JavaScript中typeof的用途介绍
2013/04/11 Javascript
jqgrid 表格数据导出实例
2013/11/21 Javascript
javascript鼠标滑动评分控件完整实例
2015/05/13 Javascript
JS简单实现多级Select联动菜单效果代码
2015/09/06 Javascript
AngularJS基础 ng-class-odd 指令示例
2016/08/01 Javascript
基于JavaScript实现滑动门效果
2017/03/16 Javascript
vuejs 单文件组件.vue 文件的使用
2017/07/28 Javascript
vue watch自动检测数据变化实时渲染的方法
2018/01/16 Javascript
JS获取并处理php数组的方法实例分析
2018/09/04 Javascript
快速了解Node中的Stream流是什么
2019/02/13 Javascript
Vue使用zTree插件封装树组件操作示例
2019/04/25 Javascript
javascript实现时间日期的格式化的方法汇总
2020/08/06 Javascript
js实现简易ATM功能
2020/10/27 Javascript
基于vue实现微博三方登录流程解析
2020/11/04 Javascript
[00:27]DOTA2荣耀之路2:Patience from zhou!
2018/05/24 DOTA
Python中DJANGO简单测试实例
2015/05/11 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
2018/04/08 Python
Python决策树之基于信息增益的特征选择示例
2018/06/25 Python
有关Python的22个编程技巧
2018/08/29 Python
Django时区详解
2019/07/24 Python
Python queue队列原理与应用案例分析
2019/09/27 Python
python实现经典排序算法的示例代码
2021/02/07 Python
灵活运用CSS3特性绘制简易版围棋效果
2016/09/28 HTML / CSS
html5 canvas绘制网络字体的常用方法
2019/08/26 HTML / CSS
Champs Sports加拿大:北美最大的以商场为基础的专业运动鞋和服装零售商之一
2018/05/01 全球购物
万户网络JAVA程序员岗位招聘笔试试卷
2013/01/08 面试题
自我鉴定范文200字
2013/10/02 职场文书
正规的求职信范文分享
2013/12/11 职场文书
火灾现场处置方案
2014/05/28 职场文书
宣传口号大全
2014/06/16 职场文书
学习礼仪心得体会
2014/09/01 职场文书
信用卡结清证明怎么写
2014/09/13 职场文书