哪些web服务器与gevent兼容,以及两者之间的关系



我想使用Flask及其SocketIO插件启动一个web项目,该插件依赖于gevent(一些绿色的东西),但我不明白gevent与web服务器的关系。使用gevent会限制我选择服务器吗?它与我们在python中拥有的不同级别的网络服务器(例如Nginx/Apache、Gunicorn)有何关系?

谢谢你的真知灼见。

首先,让我们澄清一下我们正在谈论的内容:

  • gevent是一个允许对事件循环进行编程的库。这是一种在不"阻塞"请求者的情况下立即返回响应的方法。

  • socket.io是一个创建客户端的javascript库,它可以维护与发送事件的服务器的永久连接。然后,库可以对这些事件作出反应。

  • greenlet认为这是一条线索。一种启动执行某些任务的多个工作人员的方法。

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

想象一下你正在创建一个聊天客户端。

当有人键入消息时,您需要一种通知用户屏幕的方式。要做到这一点,您需要某种方法来告诉所有用户何时显示新消息。socket.io就是这么做的。你可以把它想象成一台调到特定频率的收音机。每当有人在这个频率上传输时,代码就会起作用。在聊天程序的情况下,它会将消息添加到聊天框窗口中。

当然,如果你有一台调到某个频率的收音机(你的客户),那么你需要一个电台/dj在这个频率上传输。这就是你的烧瓶代码的来源。它会创建"房间",然后传输信息。客户端侦听这些消息。

您也可以使用node在socket.io中编写服务器端("无线电台")代码,但这超出了这里的范围

这里的问题是,传统的网络服务器是这样工作的:

  1. 用户在浏览器中键入地址,然后点击回车键(或转到)
  2. 浏览器读取网址,然后使用DNS系统找到服务器的IP地址
  3. 它创建一个到服务器的连接,然后发送一个请求
  4. Web服务器接受请求
  5. 它完成一些工作,或者启动一些进程(取决于请求的类型)
  6. 它准备(或接收)来自流程的响应
  7. 它将响应发送到客户端
  8. 它会关闭连接

在3到8之间,客户端(浏览器)正在等待响应-它被阻止执行任何其他操作。因此,如果某个地方出现问题,比如某个服务器端脚本处理请求的时间太长,浏览器就会停留在白色页面上,加载图标会旋转。在整个过程完成之前,它什么都做不了。这就是网络的设计初衷。

这种"阻塞"架构适用于1对1通信。然而,对于多个人来说,这种阻止是不起作用的。

事件库(gevent)有助于实现这一点,因为它们接受并且不会阻止客户端;当过程完成时,他们立即发送响应。

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

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

  1. 所以工作请求是从一端来的——被接受了
  2. 工作被执行,响应由其他程序生成(它可能是同一个程序或另一个程序)
  3. 然后,会发送一条通知:"嘿,我完成了你的请求——这是回复"
  4. 第1步中的人员,倾听此消息,然后采取措施

下面是WebSocket,这是一种新的全双工协议,可以实现所有这些无线电/dj功能。

WebSockets和HTTP:之间的共同点

  1. 在同一端口上工作(80)
  2. WebSocket请求一开始是握手的HTTP请求(升级标头),但随后转移到WebSocket协议,此时连接将切换到兼容WebSocket的服务器

传统的web服务器所要做的就是监听这个握手请求,确认它,然后将请求传递到与websocket兼容的服务器——就像任何其他普通的代理请求一样。

  • 对于Apache,可以使用mod_proxy_wstunnel
  • 对于nginx 1.3+版本,内置websocket支持

相关内容

最新更新