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 实现插入排序算法
Jun 05 Python
python cx_Oracle模块的安装和使用详细介绍
Feb 13 Python
Python编程实现的简单神经网络算法示例
Jan 26 Python
使用50行Python代码从零开始实现一个AI平衡小游戏
Nov 21 Python
运用Python的webbrowser实现定时打开特定网页
Feb 21 Python
详解Python安装tesserocr遇到的各种问题及解决办法
Mar 07 Python
Python 实现交换矩阵的行示例
Jun 26 Python
Python Threading 线程/互斥锁/死锁/GIL锁
Jul 21 Python
wxpython绘制音频效果
Nov 18 Python
Python Lambda函数使用总结详解
Dec 11 Python
Window版下在Jupyter中编写TensorFlow的环境搭建
Apr 10 Python
Python 2.6.6升级到Python2.7.15的详细步骤
Dec 14 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实现多服务器共享SESSION数据的方法
2007/03/16 PHP
PHP 图像尺寸调整代码
2010/05/26 PHP
php常用Stream函数集介绍
2013/06/24 PHP
destoon安装出现Internal Server Error的解决方法
2014/06/21 PHP
Laravel框架中实现使用阿里云ACE缓存服务
2015/02/10 PHP
php判断输入是否是纯数字,英文,汉字的方法
2015/03/05 PHP
PHP实现获取某个月份周次信息的方法
2015/08/11 PHP
jQuery调用WebService的实现代码
2011/06/19 Javascript
javascript动态的改变IFrame的高度实现自动伸展
2013/10/12 Javascript
js中的时间转换—毫秒转换成日期时间的示例代码
2014/01/26 Javascript
JavaScript 变量、作用域及内存
2015/04/08 Javascript
Javascript中的getUTCDay()方法使用详解
2015/06/10 Javascript
三种Node.js写文件的方式
2016/03/08 Javascript
bootstrap-wysiwyg结合ajax实现图片上传实时刷新功能
2016/05/27 Javascript
jQuery双向列表选择器DIV模拟版
2016/11/01 Javascript
解决Mac安装thrift因bison报错的问题
2018/05/17 Javascript
js数组去重的N种方法(小结)
2018/06/07 Javascript
浅析Vue 生命周期
2018/06/21 Javascript
[00:53]2015国际邀请赛 中国区预选赛一触即发
2015/05/14 DOTA
python基础教程之常用运算符
2014/08/29 Python
Python批量重命名同一文件夹下文件的方法
2015/05/25 Python
python读文件的步骤
2019/10/08 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
2020/04/08 Python
Python Scrapy图片爬取原理及代码实例
2020/06/12 Python
Python 代码调试技巧示例代码
2020/08/11 Python
详解Django中异步任务之django-celery
2020/11/05 Python
Html5实现单张、多张图片上传功能
2019/04/28 HTML / CSS
德国箱包网上商店:koffer24.de
2016/07/27 全球购物
环境科学专业个人求职信
2013/09/26 职场文书
暑期培训随笔感言
2014/03/10 职场文书
软弱涣散基层党组织整改方案
2014/10/25 职场文书
2014年招生工作总结
2014/11/26 职场文书
股权转让协议书
2014/12/07 职场文书
股份转让协议书范本
2015/01/27 职场文书
教师个人总结范文
2015/02/11 职场文书
用Python编写简单的gRPC服务的详细过程
2021/07/04 Python