python如何支持并发?
由于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实现支持并发、断点续传的Ftp程序
一.要求 1.用户md5认证 2.支持多用户同时登陆(并发) 3.进入用户的命令行模式,支持cd切换目录,ls查看目录子文件 4.执行命令(ipconfig) 5.传输文件: a.支持断点续传 b.传 ...
- 第五十六节,python实现支持并发、断点续传的Ftp程序
一.要求 1.用户md5认证 2.支持多用户同时登陆(并发) 3.进入用户的命令行模式,支持cd切换目录,ls查看目录子文件 4.执行命令(ipconfig) 5.传输文件: a.支持断点续传 b.传 ...
- Python实现支持并发、断点续传的FTP
参考网上一个FTP程序,重写了一遍,并稍加扩展 一.要求 1. 支持多用户同时登录 2. 可以注册用户,密码使用md5加密 3. 可以登录已注册用户 4. 支持cd切换目录,ls查看目录子文件 5. ...
- Python中的并发编程
简介 我们将一个正在运行的程序称为进程.每个进程都有它自己的系统状态,包含内存状态.打开文件列表.追踪指令执行情况的程序指针以及一个保存局部变量的调用栈.通常情况下,一个进程依照一个单序列控制流顺序执 ...
- Python开源异步并发框架
Python开源异步并发框架的未来 2014年3月30日,由全球最大的中文IT社区CSDN主办的“开源技术大会·” (Open Source Technology Conference ,简称OSTC ...
- python学习之并发编程
目录 一.并发编程之多进程 1.multiprocessing模块介绍 2.Process类的介绍 3.Process类的使用 3.1 创建开启子进程的两种方式 3.2 获取进程pid 3.3验证进程 ...
- 百万年薪python之路 -- 并发编程之 多线程 二
1. 死锁现象与递归锁 进程也有死锁与递归锁,进程的死锁和递归锁与线程的死锁递归锁同理. 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因为争夺资源而造成的一种互相等待的现象,在无外力的作用 ...
- 如何让你的Python程序支持多语言
如何让你的Python程序支持多语言 本文介绍如何通过Python标准库gettext帮助你的程序支持多语言. 代码例子 import random guessesTaken = 0 print(_( ...
- Python几种并发实现方案的性能比较
http://blog.csdn.net/permike/article/details/54846831 Python几种并发实现方案的性能比较 2017-02-03 14:33 1541人阅读 评 ...
随机推荐
- 入门大数据---Hive数据查询详解
一.数据准备 为了演示查询操作,这里需要预先创建三张表,并加载测试数据. 数据文件 emp.txt 和 dept.txt 可以从本仓库的resources 目录下载. 1.1 员工表 -- 建表语句 ...
- 入门大数据---Spark简介
一.简介 Spark 于 2009 年诞生于加州大学伯克利分校 AMPLab,2013 年被捐赠给 Apache 软件基金会,2014 年 2 月成为 Apache 的顶级项目.相对于 MapRedu ...
- JDK8--02:为什么要使用lambda
lambda是一个匿名函数,我们可以把lambda理解为一个可以传递的代码(将代码像数据一样传递),可以写出更简洁更灵活的代码.首先看一下原来的匿名内部类实现方式(以比较器为例) //原来的匿名内部类 ...
- SpringBoot--整合Lettuce redis
首先解释一下Lettuce客户端: Lettuce 和 Jedis 的都是连接Redis Server的客户端程序.Jedis在实现上是直连redis server,多线程环境下非线程安全,除非使用连 ...
- dup与dup2函数
依赖的头文件 #include <unistd.h> 函数定义 int dup(int oldfd); int dup2(int oldfd, int newfd); 函数作用 dup和d ...
- Python之浅谈绑定方法
目录 绑定方法和非绑定方法 绑定方法 对象的绑定方法 类的绑定方法 非绑定方法 总结 绑定方法和非绑定方法 类中定义的方法大致可以分为两类:绑定方法和非绑定方法.其中绑定方法又可以分为绑定到对象的方法 ...
- Redis系列(十):数据结构Set源码解析和SADD、SINTER、SDIFF、SUNION、SPOP命令
1.介绍 Hash是以K->V形式存储,而Set则是K存储,空间节省了很多 Redis中Set是String类型的无序集合:集合成员是唯一的. 这就意味着集合中不能出现重复的数据.可根据应用场景 ...
- vue-devtools的安装
为了能够很好的检查vue代码,安装vue-devtools; 1.下载devtools插件,建议大家去找正规的路径下载(随便在网页上下载的缺文件,我已入坑),正规地址:https://github.c ...
- 线下---复习day04---作业
1 学的不好的同学:用ajax提交一个json格式数据,返回一个json格式数据,console.log打印出来 2 通过ajax上传一个文件并保存起来,前端接收到,弹窗说上传成功 urls.py f ...
- SpringCloud和SpringBoot对应的版本选型
SpringBoot版本选择: 官网地址:https://spring.io/projects/spring-boot SpringBoot官方目前最新最稳定版:2.3.1,如果单独使用SpringB ...