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 相关文章推荐
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
Jan 23 Python
Python中模块pymysql查询结果后如何获取字段列表
Jun 05 Python
Python编写一个闹钟功能
Jul 11 Python
python with提前退出遇到的坑与解决方案
Jan 05 Python
Python使用字典的嵌套功能详解
Feb 27 Python
python程序控制NAO机器人行走
Apr 29 Python
python实现人脸签到系统
Apr 13 Python
判断Threading.start新线程是否执行完毕的实例
May 02 Python
Python中Yield的基本用法
Oct 18 Python
Python中快速掌握Data Frame的常用操作
Mar 31 Python
使用tensorflow 实现反向传播求导
May 26 Python
Django Paginator分页器的使用示例
Jun 23 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
超人钢铁侠联手合作?美漫作家呼吁DC漫威合作联动以抵抗疫情
2020/04/09 欧美动漫
PHP中防止SQL注入实现代码
2011/02/19 PHP
采用header定义为文件然后readfile下载(隐藏下载地址)
2014/01/31 PHP
php随机取mysql记录方法小结
2014/12/27 PHP
百度工程师讲PHP函数的实现原理及性能分析(二)
2015/05/13 PHP
PHP magento后台无法登录问题解决方法
2016/11/24 PHP
Mootools 1.2教程 Tooltips
2009/09/15 Javascript
客户端js判断文件类型和文件大小即限制上传大小
2013/11/20 Javascript
javascript中的作用域和上下文使用简要概述
2013/12/05 Javascript
深入理解JavaScript系列(47):对象创建模式(上篇)
2015/03/04 Javascript
jquery解析XML及获取XML节点名称的实现代码
2016/05/18 Javascript
关于两个jQuery(js)特效冲突的bug的解决办法
2016/09/04 Javascript
Bootstrap源码解读媒体对象、列表组和面板(10)
2016/12/26 Javascript
bootstrap表格分页实例讲解
2016/12/30 Javascript
JS实现二叉查找树的建立以及一些遍历方法实现
2017/04/17 Javascript
移动端web滚动分页的实现方法
2017/05/05 Javascript
vue跨域解决方法
2017/10/15 Javascript
[01:05:32]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第一局
2016/03/04 DOTA
[01:03:41]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第三场 2月2日
2021/03/11 DOTA
Python实现简单过滤文本段的方法
2017/05/24 Python
在Python中获取两数相除的商和余数方法
2018/11/10 Python
浅谈Python接口对json串的处理方法
2018/12/19 Python
python 使用while写猜年龄小游戏过程解析
2019/10/07 Python
Python学习笔记之函数的参数和返回值的使用
2019/11/20 Python
python代码如何实现余弦相似性计算
2020/02/09 Python
解决Python在导入文件时的FileNotFoundError问题
2020/04/10 Python
Python urllib request模块发送请求实现过程解析
2020/12/10 Python
香蕉共和国Banana Republic官网:美国GAP旗下偏贵族风格服饰品牌
2016/11/21 全球购物
汇集了世界上最好的天然和有机美容产品:LoveLula
2018/02/05 全球购物
高性能钓鱼服装:Huk Gear
2019/02/20 全球购物
怎么写好自荐信
2013/10/30 职场文书
2014年祖国生日寄语
2014/09/19 职场文书
护士2014年终工作总结
2014/11/11 职场文书
如何用JavaScript学习算法复杂度
2021/04/30 Javascript
python 中的@运算符使用
2021/05/26 Python
Jmerte 分布式压测及分布式压测配置
2022/04/30 Java/Android