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设计模式之观察者模式实例
Apr 26 Python
python基础教程之基本数据类型和变量声明介绍
Aug 29 Python
Python for Informatics 第11章之正则表达式(二)
Apr 21 Python
简单掌握Python的Collections模块中counter结构的用法
Jul 07 Python
你所不知道的Python奇技淫巧13招【实用】
Dec 14 Python
Python中optparser库用法实例详解
Jan 26 Python
python使用Flask操作mysql实现登录功能
May 14 Python
python3实现斐波那契数列(4种方法)
Jul 15 Python
python-序列解包(对可迭代元素的快速取值方法)
Aug 24 Python
通过实例解析Python return运行原理
Mar 04 Python
Python3+RIDE+RobotFramework自动化测试框架搭建过程详解
Sep 23 Python
python3.9之你应该知道的新特性详解
Apr 29 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中的替代语法简介
2014/08/22 PHP
10个值得深思的PHP面试题
2016/11/14 PHP
Laravel5中Cookie的使用详解
2017/05/03 PHP
php源码的使用方法讲解
2019/09/26 PHP
checkbox全选/取消全选以及checkbox遍历jQuery实现代码
2009/12/02 Javascript
JavaScript基础语法让人疑惑的地方小结
2012/05/23 Javascript
页面使用密码保护代码
2013/04/10 Javascript
jquery实现table鼠标经过变色代码
2013/09/25 Javascript
通过url查找a元素并点击
2014/04/09 Javascript
SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
2015/12/10 Javascript
JavaScript常见的五种数组去重的方式
2016/12/15 Javascript
JQuery 又谈ajax局部刷新
2017/11/27 jQuery
基于Swiper实现移动端页面图片轮播效果
2017/12/28 Javascript
gulp构建小程序的方法步骤
2019/05/31 Javascript
微信公众号平台接口开发 获取微信服务器IP地址方法解析
2019/08/14 Javascript
vue如何实现动态加载脚本
2020/02/05 Javascript
python 实现文件的递归拷贝实现代码
2012/08/02 Python
python实现360的字符显示界面
2014/02/21 Python
python通过定义一个类实例作为ftp回调方法
2015/05/04 Python
在python中利用KNN实现对iris进行分类的方法
2018/12/11 Python
python解析json串与正则匹配对比方法
2018/12/20 Python
python 多线程串行和并行的实例
2019/02/22 Python
pandas删除行删除列增加行增加列的实现
2019/07/06 Python
Python OpenCV读取显示视频的方法示例
2020/02/20 Python
使用pyplot.matshow()函数添加绘图标题
2020/06/16 Python
Django实现内容缓存实例方法
2020/06/30 Python
纯CSS3实现扇形动画菜单(简化版)实例源码
2017/01/17 HTML / CSS
独特的礼品和创新的科技产品:The Grommet
2018/02/24 全球购物
澳大利亚实惠时尚女装商店:Katies
2019/06/16 全球购物
NULL是什么,它是怎么定义的
2015/05/09 面试题
Shell如何接收变量输入
2016/08/06 面试题
远程调用的原理
2014/07/05 面试题
理工科学生的自我评价
2013/12/15 职场文书
工作自我评价怎么写
2014/01/29 职场文书
婚礼主持结束词
2014/03/13 职场文书
委托书范本
2014/04/02 职场文书