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 相关文章推荐
两个命令把 Vim 打造成 Python IDE的方法
Mar 20 Python
Python中偏函数用法示例
Jun 07 Python
python绘制漏斗图步骤详解
Mar 04 Python
python批量修改图片尺寸,并保存指定路径的实现方法
Jul 04 Python
对python中UDP,socket的使用详解
Aug 22 Python
python3.6连接mysql数据库及增删改查操作详解
Feb 10 Python
Python3中configparser模块读写ini文件并解析配置的用法详解
Feb 18 Python
Python叠加矩形框图层2种方法及效果
Jun 18 Python
django美化后台django-suit的安装配置操作
Jul 12 Python
Python 远程开关机的方法
Nov 18 Python
使用python tkinter开发一个爬取B站直播弹幕工具的实现代码
Feb 07 Python
Python页面加载的等待方式总结
Feb 28 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/08 PHP
从康盛产品(discuz)提取出来的模板类
2011/06/28 PHP
php实现的九九乘法口诀表简洁版
2014/07/28 PHP
功能强大的php文件上传类
2016/08/29 PHP
Laravel5.5 实现后台管理登录的方法(自定义用户表登录)
2019/09/30 PHP
jQuery中需要注意的细节问题小结
2011/12/06 Javascript
jquery.qrcode在线生成二维码使用示例
2013/08/21 Javascript
通过正则表达式实现表单验证是否为中文
2014/02/18 Javascript
JavaScript中创建字典对象(dictionary)实例
2015/03/31 Javascript
javascript实现可全选、反选及删除表格的方法
2015/05/15 Javascript
ECMAScript6快速入手攻略
2016/07/18 Javascript
Javascript中关于Array.filter()的妙用详解
2016/12/04 Javascript
全面总结Javascript对数组对象的各种操作
2017/01/22 Javascript
详解vue 单页应用(spa)前端路由实现原理
2018/04/04 Javascript
关于js对textarea换行符的处理方法浅析
2018/08/03 Javascript
opencv 识别微信登录验证滑动块位置
2018/08/07 Javascript
解决Vue-cli npm run build生产环境打包,本地不能打开的问题
2018/09/20 Javascript
vue中移动端调取本地的复制的文本方式
2020/07/18 Javascript
go语言计算两个时间的时间差方法
2015/03/13 Python
python相似模块用例
2016/03/04 Python
Python中线程的MQ消息队列实现以及消息队列的优点解析
2016/06/29 Python
Python实现的文本简单可逆加密算法示例
2017/05/18 Python
python异常触发及自定义异常类解析
2019/08/06 Python
python3的url编码和解码,自定义gbk、utf-8的例子
2019/08/22 Python
Python使用itchat模块实现群聊转发,自动回复功能示例
2019/08/26 Python
python selenium操作cookie的实现
2020/03/18 Python
俄罗斯三星品牌商店:GalaxyStore
2020/11/04 全球购物
Java方面的关于数组和继承的笔面试题
2015/09/18 面试题
资深地理教师自我评价
2013/09/21 职场文书
《晏子使楚》教学反思
2014/02/08 职场文书
大学共青团员个人自我评价
2014/04/16 职场文书
暑期社会实践心得体会
2014/09/02 职场文书
2014工程部年度工作总结
2014/12/17 职场文书
Pytest allure 命令行参数的使用
2021/04/18 Python
浅谈pytorch中的dropout的概率p
2021/05/27 Python
python字符串的多行输出的实例详解
2021/06/08 Python