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快速排序代码实例
Nov 21 Python
Python设计模式中单例模式的实现及在Tornado中的应用
Mar 02 Python
Django实现表单验证
Sep 08 Python
python 顺时针打印矩阵的超简洁代码
Nov 14 Python
Python使用POP3和SMTP协议收发邮件的示例代码
Apr 16 Python
Python实现钉钉订阅消息功能
Jan 14 Python
Flask和pyecharts实现动态数据可视化
Feb 26 Python
python GUI库图形界面开发之PyQt5菜单栏控件QMenuBar的详细使用方法与实例
Feb 28 Python
使用Python第三方库pygame写个贪吃蛇小游戏
Mar 06 Python
关于Python字符串显示u...的解决方式
Mar 06 Python
浅谈Python __init__.py的作用
Oct 28 Python
Python爬虫基础之初次使用scrapy爬虫实例
Jun 26 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
apache中为php 设置虚拟目录
2014/12/17 PHP
Thinkphp3.2简单解决多文件上传只上传一张的问题
2017/09/26 PHP
ie和firefox中img对象区别的困惑
2006/12/27 Javascript
xml转json的js代码
2012/08/28 Javascript
JavaScript高级程序设计(第3版)学习笔记12 js正则表达式
2012/10/11 Javascript
js实现拖拽 闭包函数详细介绍
2012/11/25 Javascript
自己写的兼容ie和ff的在线文本编辑器类似ewebeditor
2012/12/12 Javascript
js判断undefined类型,undefined,null, 的区别详细解析
2013/12/16 Javascript
jquery遍历checkbox的注意事项说明
2014/02/21 Javascript
jQuery截取指定长度字符串的实现原理及代码
2014/07/01 Javascript
Javascript 读取操作Sql中的Xml字段
2014/10/09 Javascript
跟我学习javascript的全局变量
2015/11/16 Javascript
快速解决Canvas.toDataURL 图片跨域的问题
2016/05/10 Javascript
如何利用JSHint减少JavaScript的错误
2016/08/23 Javascript
JavaScript实现二维坐标点排序效果
2017/07/18 Javascript
Angular之toDoList的实现代码示例
2017/12/02 Javascript
gulp构建小程序的方法步骤
2019/05/31 Javascript
js实现小球在页面规定的区域运动
2020/06/16 Javascript
python实现聚类算法原理
2018/02/12 Python
对Pandas DataFrame缺失值的查找与填充示例讲解
2018/11/06 Python
在linux下实现 python 监控usb设备信号
2019/07/03 Python
Python Numpy库datetime类型的处理详解
2019/07/13 Python
Python 进程操作之进程间通过队列共享数据,队列Queue简单示例
2019/10/11 Python
Python通过Manager方式实现多个无关联进程共享数据的实现
2019/11/07 Python
python时间与Unix时间戳相互转换方法详解
2020/02/13 Python
pytorch加载自己的图像数据集实例
2020/07/07 Python
Ego Shoes官网:英国时髦鞋类品牌
2020/10/19 全球购物
马来西亚排名第一的宠物用品店:Pets Wonderland
2020/04/16 全球购物
日语专业个人的求职信
2013/12/03 职场文书
2014年高三毕业生自我评价
2014/01/11 职场文书
医院学雷锋活动策划方案
2014/02/15 职场文书
写给老婆的检讨书
2014/02/21 职场文书
学校重阳节活动总结
2015/03/24 职场文书
2015年销售员工作总结范文
2015/04/07 职场文书
天那边观后感
2015/06/09 职场文书
学习经验交流会总结
2015/11/02 职场文书