哪些Web服务器与gevent兼容,两者如何相关?

时间:2014-09-01 11:25:37

标签: python nginx gunicorn gevent

我正在寻找使用Flask及其SocketIO插件启动一个Web项目,该插件依赖于gevent(一些greenlets),但我不明白gevent是如何与webserver相关的。使用gevent是否会限制我的服务器选择?它与我们在python中的不同级别的Web服务器有什么关系(例如Nginx / Apache,Gunicorn)?

感谢您的见解。

1 个答案:

答案 0 :(得分:1)

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

  • gevent是一个允许轻松编程事件循环的库。这是一种在没有"阻止"的情况下立即返回响应的方法。请求者。

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

  • greenlet想到这个线程。一种启动多个执行某些任务的工作人员的方法。

以下是对整个过程的高度简化的概述:

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

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

当然,如果您将收音机调到一个频率(您的客户端),那么您需要一个无线电台/ dj以此频率进行传输。这里是您的烧瓶代码的来源。它将创建"房间"然后传输消息。客户端会收听这些消息。

您还可以使用node在socket.io中编写服务器端("无线电台")代码,但这不在此范围内。

这里的问题是传统上 - 网络服务器的工作原理如下:

  1. 用户在浏览器中键入地址,然后按Enter键(或go)。
  2. 浏览器读取网址,然后使用DNS系统查找服务器的IP地址。
  3. 它创建与服务器的连接,然后发送请求。
  4. 网络服务器接受请求。
  5. 它做了一些工作,或启动了一些过程(取决于请求的类型)。
  6. 准备(或接收)来自流程的回复。
  7. 它将响应发送给客户端。
  8. 关闭连接。
  9. 在3到8之间,客户端(浏览器)正在等待响应 - 阻止做其他事情。因此,如果某个地方出现问题,比如说,某些服务器端脚本处理请求的时间太长,浏览器会停留在白页上,加载图标会旋转。在整个过程完成之前,它无法执行任何操作。这就是网络设计的工作方式。

    这种'阻止'架构适用于1对1通信。但是,要让多个人保持更新,此阻止功能无效。

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

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

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

    1. 所以工作要求从一端进入 - 被接受。
    2. 执行工作并通过其他内容生成响应(可能是同一个程序或其他程序)。
    3. 然后,会发送通知"嘿,我已完成您的请求 - 这是回复"。
    4. 来自第1步的人会听取此消息,然后执行某些操作。
    5. 下面全部是WebSocket新的全双工协议,可以启用所有这些无线电/ dj功能。

      WebSockets和HTTP之间的共同点:

      1. 在同一个端口(80)上工作
      2. WebSocket请求作为握手的HTTP请求(upgrade header)开始,但随后转移到WebSocket协议 - ,此时连接被切换到与websocket兼容的服务器
      3. 您传统的Web服务器所要做的就是侦听此握手请求,确认它,然后将请求传递给与websocket兼容的服务器 - 就像任何其他正常的代理请求一样。