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 相关文章推荐
Python3基础之条件与循环控制实例解析
Aug 13 Python
Python中的pprint折腾记
Jan 21 Python
Python处理RSS、ATOM模块FEEDPARSER介绍
Feb 18 Python
Python的Flask框架中实现分页功能的教程
Apr 20 Python
python实现动态创建类的方法分析
Jun 25 Python
Django CBV与FBV原理及实例详解
Aug 12 Python
python matplotlib拟合直线的实现
Nov 19 Python
OpenCV哈里斯(Harris)角点检测的实现
Jan 15 Python
如何在windows下安装Pycham2020软件(方法步骤详解)
May 03 Python
Python直接赋值及深浅拷贝原理详解
Sep 05 Python
python中用ggplot绘制画图实例讲解
Jan 26 Python
python正则表达式re.search()的基本使用教程
May 21 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
广播爱好者需要了解的天线知识
2021/03/01 无线电
PHP程序员最常犯的11个MySQL错误小结
2010/11/20 PHP
PHP和JavaScrip分别获取关联数组的键值示例代码
2013/09/16 PHP
CI框架的安全性分析
2016/05/18 PHP
php多进程中的阻塞与非阻塞操作实例分析
2020/03/04 PHP
JS下高效拼装字符串的几种方法比较与测试代码
2010/04/15 Javascript
动感效果的TAB选项卡jquery 插件
2011/07/09 Javascript
jQuery数组处理代码详解(含实例演示)
2012/02/03 Javascript
jquery 卷帘效果实现代码(不同方向)
2013/02/05 Javascript
js定时调用方法成功后并停止调用示例
2014/04/08 Javascript
jQuery插件expander实现图片翻转特效
2015/05/21 Javascript
举例讲解jQuery中可见性过滤选择器的使用
2016/04/18 Javascript
用AngularJS的指令实现tabs切换效果
2016/08/31 Javascript
ros::spin() 和 ros::spinOnce()函数的区别及详解
2016/10/01 Javascript
jQuery图片轮播功能实例代码
2017/01/29 Javascript
AngularJs表单校验功能实例代码
2017/02/09 Javascript
解读vue生成的文件目录结构及说明
2017/11/27 Javascript
Js经典案例的实例代码
2018/05/10 Javascript
Node.js创建一个Express服务的方法详解
2020/01/06 Javascript
Python中实现结构相似的函数调用方法
2015/03/10 Python
Python使用Scrapy爬取妹子图
2015/05/28 Python
python logging 日志轮转文件不删除问题的解决方法
2016/08/02 Python
Python解析json之ValueError: Expecting property name enclosed in double quotes: line 1 column 2(char 1)
2017/07/06 Python
详解python使用递归、尾递归、循环三种方式实现斐波那契数列
2018/01/16 Python
基于python OpenCV实现动态人脸检测
2018/05/25 Python
详解Python 正则表达式模块
2018/11/05 Python
简单了解django缓存方式及配置
2019/07/19 Python
Python中断多重循环的思路总结
2019/10/04 Python
详解Django中的FBV和CBV对比分析
2021/03/01 Python
Wiggle美国:英国骑行、跑步、游泳、铁人三项商店
2018/10/27 全球购物
linux面试题参考答案(5)
2014/09/01 面试题
日期和时间问题
2015/01/04 面试题
python+selenium小米商城红米K40手机自动抢购的示例代码
2021/03/24 Python
愚人节活动策划方案
2014/03/11 职场文书
医药公司开票员岗位职责
2015/04/15 职场文书
浅谈sql_@SelectProvider及使用注意说明
2021/08/04 Java/Android