并发拓展--用户态与内核态、框架并发底层原理(很重要!)
用户态和内核态、用户线程与内核态线程
https://juejin.cn/post/7140629563456880671
框架底层并发原理
# 1.django和flask项目的并发量
取决于使用的wsgi框架 (根据前端的请求,开设线程去执行视图函数)
故:项目部署 采用 uwsgi 且 动静分离, 增加项目的并发量
# 2.django和flask都是同步框架
来一个请求,wsgi框架就开启一个线程,执行视图函数
# 3.基于协程的异步框架:
asyncio (有了关键字 async和await)
sanic,fastapi Tornado, twisted 等
原理:将视图函数 都变成协程函数,同一个线程下,遇到io就会并发执行其他的视图函数
# 只要被async装饰的函数,就是协程函数
@app.route("/")
async def test(request): # async 声明该函数为协程函数
await cousor.excute() # await 声明该操作为IO操作,进行并发切换
return json({"hello": "world"})
# 4.协程:单线程下实现并发
人为的 在IO操作的命令位置 标志一下,然后cpu执行到这一步时,就并发切换到其他需要 cpu操作的地方
# 5.一旦用了异步,所有框架都必须使用异步
-pymysql,redis是同步模块 # 不能使用在异步web框架中
-需要使用专门的异步模块
aiomysql,aioredis # python到目前为止,没有一个比较好的异步orm框架
-django 3.0以后支持异步 # 故:没啥用
但 django的orm不支持异步
# 6.aioredis和aiomysql的使用
网上找资料,基本和pymysql/redis 一样,只是IO操作前 需要添加 await
# 7.为什么一旦用了异步框架,后面全要用异步?
使用异步框架sanic后, 由于使用了协程,一个线程上就有多个的视图任务
若某个视图任务 没有使用异步框架,而是使用的同步框架(eg: pymysql)
在遇到数据库IO时,释放CPU,当前视图任务就阻塞,那整个线程就阻塞了
就导致后续其他的视图任务,也会跟着阻塞
故:整体执行效率,还不如同步框架+多线程(一个视图任务占一个线程)
只有后续全部采用异步框架(eg:aiomysql)时,一个线程上的多个视图任务,才会真正遇到io 就协程切换
# 8.python的orm框架
-django的orm :同步
-sqlalchemy模块 :同步
-peewee模块 :同步和异步
多线程并发安全问题
# 多线程并发安全的问题:
多个线程同时操作同一个数据,出现错乱
# 解决:
使用同步锁(互斥锁)--》修改数据之前谁先拿到锁---》开始修改---》释放锁--》别人再拿锁
但只能限制同一台机器的锁,其他机器无法限制 故:延伸出 分布式锁
# 线程锁---> 分布式锁
# 锁的概念拓展:
# 延伸
线程锁 ---> 分布式锁(多台机器争夺同一个锁)
同步锁 (因死锁)---> 递归锁(可重入锁)
# 死锁简述: 同步锁(互斥锁) 在有多个锁时,可能会造成死锁现象
两个线程,需要同时有两个锁,才能继续操作
但在资源获取时,各自都抢到一把锁,缺少另一把锁,且不会释放自己的锁,就造成死锁现象
eg: 两个人拿筷子 吃饭,都只拿到一根筷子
# 递归锁(可重入锁)
将互斥锁的多个不同锁,修改成都是同一把锁,只是可以获取多次 (就代表需要多个锁)
此时,一个线程先拿到一把锁后,其他线程就无法拿锁了,此线程就可接着再获取多次
后续释放时 就需要多次释放
# 悲观锁和乐观锁
只是看待锁的形式,跟线程锁 还是分布式锁,没有任何关系。
# 悲观锁:
悲观的认为,操作数据时,别人也会修改,故都给锁上 是真正的锁 eg:线程锁/分布式锁
# 乐观锁: # 没有真正的锁
乐观的认为,操作数据时,别人不会修改,不加锁
只是在执行更新的时候判断一下在此期间别人是否修改了数据:如果别人修改了数据则放弃操作,否则执行操作。
# Event事件
类似发射信号,一些线程需要等到其他线程执行完成后,才能执行
eg: 女神单身信号发出后,其他人开始追求
# Semaphore(信号量)多把锁
同时允许多个线程来修改数据
分类:
Python并发编程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异