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基于PycURL实现POST的方法
Jul 25 Python
Python中的模块导入和读取键盘输入的方法
Oct 16 Python
Python基于socket模块实现UDP通信功能示例
Apr 10 Python
python批量导入数据进Elasticsearch的实例
May 30 Python
浅谈python3发送post请求参数为空的情况
Dec 28 Python
python自定义线程池控制线程数量的示例
Feb 22 Python
Python实现的读取文件内容并写入其他文件操作示例
Apr 09 Python
Pytorch反向求导更新网络参数的方法
Aug 17 Python
python实现密码强度校验
Mar 18 Python
Keras - GPU ID 和显存占用设定步骤
Jun 22 Python
python基于tkinter制作无损音乐下载工具
Mar 29 Python
据Python爬虫不靠谱预测可知今年双十一销售额将超过6000亿元
Nov 11 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
PHPMailer使用教程(PHPMailer发送邮件实例分析)
2012/12/06 PHP
CI框架开发新浪微博登录接口源码完整版
2014/05/28 PHP
php版银联支付接口开发简明教程
2016/10/14 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
通过jquery还原含有rowspan、colspan的table的实现方法
2012/02/10 Javascript
解决js数据包含加号+通过ajax传到后台时出现连接错误
2013/08/01 Javascript
构造函数+原型模式构造js自定义对象(最通用)
2014/05/12 Javascript
两种方法基于jQuery实现IE浏览器兼容placeholder效果
2014/10/14 Javascript
属于你的jQuery提示框(Tip)插件
2016/01/20 Javascript
jQuery validate+artdialog+jquery form实现弹出表单思路详解
2016/04/18 Javascript
js简单获取表单中单选按钮值的方法
2016/08/23 Javascript
javascript中递归的两种写法
2017/01/17 Javascript
Vue 父子组件、组件间通信
2017/03/08 Javascript
Vue.js实战之通过监听滚动事件实现动态锚点
2017/04/04 Javascript
AngularJS实现的省市二级联动功能示例【可对选项实现增删】
2017/10/26 Javascript
基于express中路由规则及获取请求参数的方法
2018/03/12 Javascript
vue组件间通信六种方式(总结篇)
2019/05/15 Javascript
使用vue重构资讯页面的实例代码解析
2019/11/26 Javascript
[01:08:44]NB vs VP 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[50:44]DOTA2-DPC中国联赛 正赛 SAG vs Dragon BO3 第二场 2月22日
2021/03/11 DOTA
python和pyqt实现360的CLable控件
2014/02/21 Python
简单介绍Python中利用生成器实现的并发编程
2015/05/04 Python
详谈Python中列表list,元祖tuple和numpy中的array区别
2018/04/18 Python
详谈python3 numpy-loadtxt的编码问题
2018/04/29 Python
Numpy array数据的增、删、改、查实例
2018/06/04 Python
Python动态语言与鸭子类型详解
2019/07/01 Python
Django多数据库配置及逆向生成model教程
2020/03/28 Python
Python faker生成器生成虚拟数据代码实例
2020/07/20 Python
利用Python实现斐波那契数列的方法实例
2020/07/26 Python
html5的画布canvas——画出弧线、旋转的图形实例代码+效果图
2013/06/09 HTML / CSS
12个不为大家熟知的HTML5设计小技巧
2016/06/02 HTML / CSS
怎么写自荐书范文
2014/02/12 职场文书
公共机构节能宣传周活动总结
2014/07/09 职场文书
2015年小学一年级班主任工作总结
2015/05/21 职场文书
根德5570型九灯四波段立体声收音机是电子管收音机的楷模 ? 再论5570
2022/04/05 无线电
ubuntu开机后ROS程序自启动问题
2022/12/24 Servers