ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

并发拓展--框架并发底层原理(很重要!)

2022-08-04 13:34:44  阅读:176  来源: 互联网

标签:异步 协程 框架 -- 视图 并发 线程 底层


框架底层并发原理

# 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模块      :同步和异步

标签:异步,协程,框架,--,视图,并发,线程,底层
来源: https://www.cnblogs.com/Edmondhui/p/16550244.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有