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模块学习 filecmp 文件比较
Aug 27 Python
使用Python编写基于DHT协议的BT资源爬虫
Mar 19 Python
Python实现的摇骰子猜大小功能小游戏示例
Dec 18 Python
利用Tkinter(python3.6)实现一个简单计算器
Dec 21 Python
Python  unittest单元测试框架的使用
Sep 08 Python
numpy下的flatten()函数用法详解
May 27 Python
django将数组传递给前台模板的方法
Aug 06 Python
python实现加密的方式总结
Jan 19 Python
python多项式拟合之np.polyfit 和 np.polyld详解
Feb 18 Python
Keras Convolution1D与Convolution2D区别说明
May 22 Python
Python中的wordcloud库安装问题及解决方法
May 27 Python
Numpy ndarray 多维数组对象的使用
Feb 10 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 过滤器实现代码
2010/08/09 PHP
PHP5中GD库生成图形验证码(有汉字)
2013/07/28 PHP
php获取错误信息的方法
2015/07/17 PHP
php设计模式之抽象工厂模式分析【星际争霸游戏案例】
2020/01/23 PHP
JObj预览一个JS的框架
2008/03/13 Javascript
原生js实现百叶窗效果及原理介绍
2016/04/12 Javascript
javascript+HTML5 Canvas绘制转盘抽奖
2020/05/16 Javascript
JavaScript用构造函数如何获取变量的类型名
2016/12/23 Javascript
DropDownList控件绑定数据源的三种方法
2016/12/24 Javascript
Vue.js框架路由使用方法实例详解
2017/08/25 Javascript
微信小程序tabbar底部导航
2018/11/05 Javascript
浅谈ng-zorro使用心得
2018/12/03 Javascript
layui-table对返回的数据进行转变显示的实例
2019/09/04 Javascript
js 下拉菜单点击旁边收起实现(踩坑记)
2019/09/29 Javascript
如何使用webpack打包一个库library的方法步骤
2019/12/18 Javascript
Vue+Bootstrap收藏(点赞)功能逻辑与具体实现
2020/10/22 Javascript
python 简易计算器程序,代码就几行
2009/08/29 Python
python实现从一组颜色中找出与给定颜色最接近颜色的方法
2015/03/19 Python
Python文本处理之按行处理大文件的方法
2018/04/09 Python
python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)
2019/04/18 Python
Python supervisor强大的进程管理工具的使用
2019/04/24 Python
解决pyqt5中QToolButton无法使用的问题
2019/06/21 Python
基于python-opencv3的图像显示和保存操作
2019/06/27 Python
python单例模式原理与创建方法实例分析
2019/10/26 Python
利用Python实现学生信息管理系统的完整实例
2020/12/30 Python
Lookfantastic香港官网:英国知名美妆购物网站
2018/06/19 全球购物
荷兰鞋类购物网站:Donelli
2019/05/24 全球购物
介绍一下Linux文件的记录形式
2012/04/18 面试题
秋季红领巾广播稿
2014/01/27 职场文书
销售团队激励口号
2014/06/06 职场文书
电子商务专业应届毕业生求职信
2014/06/21 职场文书
教师工作失职检讨书
2014/09/18 职场文书
志愿者服务活动总结报告
2015/05/06 职场文书
2016年学校十一国庆节活动总结
2016/04/01 职场文书
python编写函数注意事项总结
2021/03/29 Python
Javascript使用integrity属性进行安全验证
2021/11/07 Javascript