gpt4 book ai didi

python - 哪些Web服务器与gevent兼容,两者之间有何关系?

转载 作者:太空宇宙 更新时间:2023-11-03 18:12:39 24 4
gpt4 key购买 nike

我希望使用Flask及其SocketIO插件启动一个Web项目,该项目取决于gevent(有点像greenlet),但我不了解gevent与Web服务器的关系。使用gevent是否完全限制了我的服务器选择?它与python中不同级别的Web服务器有何关系(例如Nginx / Apache,Gunicorn)?

感谢您的见解。

最佳答案

首先,让我们澄清一下我们在说什么:


gevent是一个库,可以轻松地对事件循环进行编程。这是一种立即返回响应而不会“阻塞”请求者的方法。
socket.io是一个JavaScript库创建客户端,可以维护与发送事件的服务器的永久连接。然后,库可以对这些事件做出反应。
greenlet认为这是一个线程。启动多个执行某些任务的工作程序的方法。


整个过程的高度简化的概述如下:

假设您正在创建聊天客户端。

您需要一种在任何人键入消息时通知用户屏幕的方法。为此,您需要以某种方式告诉所有用户何时将显示新消息。那就是socket.io所做的。您可以将其视为调谐到特定频率的收音机。每当有人以该频率发送时,代码就会执行某些操作。对于聊天程序,它将消息添加到聊天框窗口。

当然,如果您的收音机调谐到某个频率(您的客户端),则需要一个电台/ dj在该频率上进行发射。这是烧瓶代码的输入位置。它将创建“房间”,然后传输消息。客户端监听这些消息。

您也可以使用node在socket.io中编写服务器端(“无线电台”)代码,但这在本文范围之外。

这里的问题是传统上-Web服务器的工作方式如下:


用户在浏览器中输入地址,然后按Enter(或转到)。
浏览器读取网址,然后使用DNS系统查找服务器的IP地址。
它创建到服务器的连接,然后发送请求。
网络服务器接受请求。
它完成一些工作,或启动一些过程(取决于请求的类型)。
它准备(或接收)来自流程的响应。
它将响应发送到客户端。
它将关闭连接。


在3到8之间,客户端(浏览器)正在等待响应-阻止其执行其他任何操作。因此,如果某个地方存在问题,例如某些服务器端脚本花费太长时间来处理请求,则浏览器将停留在白页上,并且加载图标旋转。在整个过程完成之前,它什么也做不了。这就是设计网络工作方式的方式。

这种“阻塞”架构非常适合一对一通信。但是,对于多个人保持最新状态,此阻止无效。

事件库(gevent)对此有所帮助,因为它们接受并且不会阻止客户端。他们会在过程完成后立即发送响应。

但是,您的应用程序仍需要通知客户端。但是,由于连接已关闭-您无法联系客户。

为了通知客户端并确保客户端不需要“刷新”,应打开一个永久连接-这就是socket.io所做的。它会打开一个永久连接,并且始终在侦听消息。


因此工作请求来自一端-被接受。
执行该工作,并由其他事物生成响应(它可以是同一程序或另一个程序)。
然后,发送一条通知“嘿,我已经完成您的请求-这是响应”。
步骤1中的人员会侦听此消息,然后执行某些操作。


底层是WebSocket一个新的全双工协议,该协议支持所有此radio / dj功能。

WebSockets和HTTP之间的共同点:


在同一端口上工作(80)
WebSocket请求从HTTP请求握手开始(upgrade header)开始,但随后切换到WebSocket协议-此时,连接已切换到与Websocket兼容的服务器。


传统的Web服务器要做的就是侦听此握手请求,确认该请求,然后将该请求传递到与Websocket兼容的服务器上,就像其他普通代理请求一样。


对于Apache,可以使用mod_proxy_wstunnel
对于Nginx版本1.3+ have websocket support built-in

关于python - 哪些Web服务器与gevent兼容,两者之间有何关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25604798/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com