一次性讲明白uwsgi、wsgi和asgi协议以及运作原理

  1. uwsgi 服务器支持了三种协议,wsgi,uwsgi,http,三种协议分别为对外可以提供http协议的监听服务,你访问http://example.com/xxx能够被uwsgi服务器监听到,uwsgi协议用来与nginx直接通信,但nginx需要安装uwsgi模块,否则不能通信,采用该协议可以比http协议更精简,通信速度更快,wsgi协议用来与django等框架进行通信,主要是针对于Header.Range/Origin 这些字段如何装填成为Python对象,以及Python对象最后怎么返回制定对象给uWSGI服务器,如果没有这个标准,那就很难写python框架服务器了,因为每个人都有每个人返回的对象结构,你叫status,我可以叫state等等,有了WSGI协议,Django返回的状态码只能用status,这样大家就可以专心的开发Python web服务器,而有些人可以专心的开发Web应用框架
  2.  asgi 协议一般和async/await同时出现,但也不必和async/await一起出现,asgi可以理解为javascript的事件循环方式,也即每次来了一个request请求,asgi服务器(uvicorn)都会给这次request分配一个回调函数,而不阻塞主线程继续接收新的request,至于回调函数怎么变成promise,promise如何与生成器构成async/await语法,这个请自行补充javascript相关知识,后端语言在这块讲解的特别少,前端语言却把这个说得极其详细,python在编写协程时,会启动一个loop = asyncio.get_event_loop() # 创建事件循环 ,这个被javascript隐藏了,因为javascript在每一个tab启动后都相当于自动运行了一个事件循环服务,html里面的javascript脚本都是动态注入脚本,所以,也没有任何必要让你手动启动事件循环服务,而后端python是要自己写一个app,一个tab就相当于一个app,因此需要你手动启动事件循环服务,才能让这个服务正常运行,否则就是一堆死代码,将前端和后端语言结合,就能搞清楚事件循环的过程
  3. asgi采用协程的方式大大提高了并发量,以及保证了稳定性,原来的的服务端和应用框架之间,每来一个request请求,uwsgi服务器都要开一个线程等待,直到应用服务端处理完毕后,才能中断,这在内存不足,cpu争抢时,很容易被kill掉,此外每次都创建一个线程,对内存的消耗也很大,改为异步方式,将降低内存消耗,提高并发量
  4. asgi方式并不影响应用程序是同步还是异步,你可以理解为执行逻辑无论是异步还是同步,只要最终调用回调函数就搞定了
  5. 此外asgi如何支持websocket这种长连接的?首先你不能觉得长连接是一直传输着的,长连接我之前一篇文档用抛数据球的方式来解释更贴切,当客户端和web服务端建立websocket链接后,两端都会保留彼此的ip和端口号,同时websocket还会生成一个session_id号,这个session_id服务端也会存储一份,当应用程序干完活后,会将这个session_id作为回调函数的参数传入,asgi服务器拿到这个回调参数后,会在自己的链接存储中,找到该session_id,然后给这个客户端发送消息,但是原来wsgi协议中没有这个session_id的key,因此应用程序也没办法给客户端回复信息,因此需要升级wsgi到asgi,补充这个key,然后asgi服务器拿到这个session_id后,遍历自己的链接队列,确定链接还保活的情况下,会把这个消息发过去,实现了客户端——服务端的来回通信。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

森叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值