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 30 Python
python高级特性和高阶函数及使用详解
Oct 17 Python
python矩阵的转置和逆转实例
Dec 12 Python
python代码 输入数字使其反向输出的方法
Dec 22 Python
分析经典Python开发工程师面试题
Apr 08 Python
Django模板语言 Tags使用详解
Sep 09 Python
Python调用Windows命令打印文件
Feb 07 Python
Python 使用 environs 库定义环境变量的方法
Feb 25 Python
Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)
Mar 10 Python
python实现每天自动签到领积分的示例代码
Aug 18 Python
Django框架安装及项目创建过程解析
Sep 14 Python
基于python获取本地时间并转换时间戳和日期格式
Oct 27 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创建桌面快捷方式实现方法
2015/12/31 PHP
php把文件设置为插件的技巧方法
2020/02/03 PHP
php实现简单四则运算器
2020/11/29 PHP
javascript(jquery)利用函数修改全局变量的代码
2009/11/02 Javascript
使用Json比用string返回数据更友好,也更面向对象一些
2011/09/13 Javascript
JavaScript实现表格快速变色效果代码
2015/08/19 Javascript
AngularJS实现分页显示数据库信息
2016/07/01 Javascript
第一次接触神奇的Bootstrap导航条
2016/08/09 Javascript
分分钟玩转Vue.js组件(二)
2017/03/01 Javascript
socket.io学习教程之基本应用(二)
2017/04/29 Javascript
JS实现点击下拉列表文本框中出现对应的网址,点击跳转按钮实现跳转
2019/11/25 Javascript
JavaScript实现多文件下载方法解析
2020/08/07 Javascript
javascript实现移动端上传图片功能
2020/08/18 Javascript
[00:27]DOTA2战队VP、Secret贺新春
2018/02/11 DOTA
[56:00]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第二场
2018/04/10 DOTA
python实现多线程暴力破解登陆路由器功能代码分享
2015/01/04 Python
python MySQLdb Windows下安装教程及问题解决方法
2015/05/09 Python
使用python实现省市三级菜单效果
2016/01/20 Python
python中的计时器timeit的使用方法
2017/10/20 Python
python 通过视频url获取视频的宽高方式
2019/12/10 Python
详解如何通过H5(浏览器/WebView/其他)唤起本地app
2017/12/11 HTML / CSS
canvas仿写贝塞尔曲线的示例代码
2017/12/29 HTML / CSS
Toppik顶丰增发纤维官网:解决头发稀疏
2017/12/30 全球购物
Java面试中常遇到的问题,也是需要注意的几点
2013/08/30 面试题
行政管理专业推荐信
2013/11/02 职场文书
军训的自我鉴定
2013/12/10 职场文书
计算机专业职业规划
2014/02/28 职场文书
劲霸男装广告词
2014/03/21 职场文书
食品安全汇报材料
2014/08/18 职场文书
音乐教师个人总结
2015/02/06 职场文书
2015年公务员工作总结
2015/04/24 职场文书
2015年幼儿园中班工作总结
2015/04/25 职场文书
小鞋子观后感
2015/06/05 职场文书
文艺委员竞选稿
2015/11/19 职场文书
小学六一儿童节活动开幕词
2016/03/04 职场文书
python异常中else的实例用法
2021/06/15 Python