我正在寻找使用Flask及其SocketIO插件启动一个Web项目,该插件依赖于gevent(一些greenlets),但我不明白gevent是如何与webserver相关的。使用gevent是否会限制我的服务器选择?它与我们在python中的不同级别的Web服务器有什么关系(例如Nginx / Apache,Gunicorn)?
感谢您的见解。
答案 0 :(得分:1)
首先,让我们澄清一下我们在谈论的内容:
gevent
是一个允许轻松编程事件循环的库。这是一种在没有"阻止"的情况下立即返回响应的方法。请求者。
socket.io
是一个javascript库创建客户端,可以维护与发送事件的服务器的永久连接。然后,图书馆可以对这些事件作出反应。
greenlet
想到这个线程。一种启动多个执行某些任务的工作人员的方法。
以下是对整个过程的高度简化的概述:
想象一下,您正在创建一个聊天客户端。
当有人键入消息时,您需要一种方法来通知用户的屏幕。为此,您需要在需要显示新消息时告诉所有用户。这就是socket.io的作用。您可以将其视为调谐到特定频率的无线电。每当有人按此频率发送时,代码就会执行某些操作。对于聊天程序,它会将消息添加到聊天框窗口。
当然,如果您将收音机调到一个频率(您的客户端),那么您需要一个无线电台/ dj以此频率进行传输。这里是您的烧瓶代码的来源。它将创建"房间"然后传输消息。客户端会收听这些消息。
您还可以使用node在socket.io中编写服务器端("无线电台")代码,但这不在此范围内。
这里的问题是传统上 - 网络服务器的工作原理如下:
在3到8之间,客户端(浏览器)正在等待响应 - 阻止做其他事情。因此,如果某个地方出现问题,比如说,某些服务器端脚本处理请求的时间太长,浏览器会停留在白页上,加载图标会旋转。在整个过程完成之前,它无法执行任何操作。这就是网络设计的工作方式。
这种'阻止'架构适用于1对1通信。但是,要让多个人保持更新,此阻止功能无效。
事件库(gevent)有助于此,因为它们接受并且不会阻止客户端;他们会在过程完成后立即发送回复。
但是,您的应用程序仍需要通知客户端。但是,当连接关闭时 - 您无法联系客户端。
为了通知客户并确保客户端不需要刷新",应该打开永久连接 - 这就是socket.io所做的事情。它打开一个永久连接,并始终在监听消息。
下面全部是WebSocket新的全双工协议,可以启用所有这些无线电/ dj功能。
WebSockets和HTTP之间的共同点:
您传统的Web服务器所要做的就是侦听此握手请求,确认它,然后将请求传递给与websocket兼容的服务器 - 就像任何其他正常的代理请求一样。
mod_proxy_wstunnel