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中使用gzip模块压缩文件的简单教程
Apr 08 Python
在Python中调用ggplot的三种方法
Apr 08 Python
黑科技 Python脚本帮你找出微信上删除你好友的人
Jan 07 Python
Python 关于反射和类的特殊成员方法
Sep 14 Python
python基础练习之几个简单的游戏
Nov 10 Python
在pandas中一次性删除dataframe的多个列方法
Apr 10 Python
用python建立两个Y轴的XY曲线图方法
Jul 08 Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
Sep 18 Python
python3下pygame如何实现显示中文
Jan 11 Python
Django 自定义404 500等错误页面的实现
Mar 08 Python
Jupyter notebook 更改文件打开的默认路径操作
May 21 Python
OpenCV-Python实现油画效果的实例
Jun 08 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 三维饼图的实现代码
2008/09/28 PHP
解析php开发中的中文编码问题
2013/08/08 PHP
一组PHP可逆加密解密算法实例代码
2014/01/21 PHP
PHP代码维护,重构变困难的4种原因分析
2016/01/25 PHP
PHP读取文件的常见几种方法
2016/11/03 PHP
关于php支持的协议与封装协议总结(推荐)
2017/11/17 PHP
Yii2.0框架模型添加/修改/删除数据操作示例
2019/07/18 PHP
javascript+xml技术实现分页浏览
2008/07/27 Javascript
JavaScript Accessor实现说明
2010/12/06 Javascript
javascript 内存回收机制理解
2011/01/17 Javascript
JavaScript输入邮箱自动提示实例代码
2014/01/13 Javascript
jQuery中的ajax async同步和异步详解
2015/09/29 Javascript
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
2015/11/09 Javascript
javascript for-in有序遍历json数据并探讨各个浏览器差异
2015/11/30 Javascript
javaScript事件学习小结(四)event的公共成员(属性和方法)
2016/06/09 Javascript
第三篇Bootstrap网格基础
2016/06/21 Javascript
js常用DOM方法详解
2017/02/04 Javascript
vue如何根据网站路由判断页面主题色详解
2018/11/02 Javascript
js实现简易点击切换显示或隐藏
2020/11/29 Javascript
详解Python中的装饰器、闭包和functools的教程
2015/04/02 Python
Python中字典和集合学习小结
2017/07/07 Python
Python基于回溯法子集树模板解决选排问题示例
2017/09/07 Python
python调用xlsxwriter创建xlsx的方法
2018/05/03 Python
Python在for循环中更改list值的方法【推荐】
2018/08/17 Python
python爬虫库scrapy简单使用实例详解
2020/02/10 Python
python异常处理之try finally不报错的原因
2020/05/18 Python
专门经营化妆刷的美国彩妆品牌:Sigma Beauty
2017/09/11 全球购物
Osklen官方在线商店:巴西服装品牌
2019/04/25 全球购物
户外活动策划方案
2014/03/12 职场文书
介绍信的格式
2015/01/30 职场文书
2015年禁毒宣传活动总结
2015/03/25 职场文书
2015年度培训工作总结范文
2015/04/02 职场文书
消防演习通知
2015/04/25 职场文书
2015年初中教师个人工作总结
2015/07/21 职场文书
成人成长感言如何写?
2019/08/16 职场文书
Redis特殊数据类型HyperLogLog基数统计算法讲解
2022/06/01 Redis