## 管理WebSockets池
ws4py提供一个ws4py.manager.WebSocketManager类,一旦执行了HTTP升级握手,就会处理ws4py.websocket.WebSocket实例。
管理强制性的,而是使其更容易跟踪并让他们在应用程序的过程中运行。
当将websocket(websocket)添加到管理器中时,文件描述符将向管理者的轮询器注册,并且opened()方法被调用。
**轮询**
管理器使用轮询机制来分派套接字传入事件。实现两个轮询器,一个使用传统选择,另一个是基于select.epoll,仅在系统上可用时才使用。
轮询在自己的线程中执行,它保持循环,直到管理器调用stop()方法。
在每个循环中,轮询器被调用以轮询所有注册的文件描述符。
如果任何一个都准备就绪,我们使用该描述符检索websocket,如果websocket尚未终止,则我们调用其一次方法,以便处理传入的字节。
如果处理失败,管理员终止websocket并将其从自身中删除。
客户端示例
以下是一个简单的示例,说明如何针对单个服务器启动2000个客户机:
```
from ws4py.client import WebSocketBaseClient
from ws4py.manager import WebSocketManager
from ws4py import format_addresses, configure_logger
logger = configure_logger()
m = WebSocketManager()
class EchoClient(WebSocketBaseClient):
def handshake_ok(self):
logger.info("Opening %s" % format_addresses(self))
m.add(self)
def received_message(self, msg):
logger.info(str(msg))
if __name__ == '__main__':
import time
try:
m.start()
for i in range(2000):
client = EchoClient('ws://localhost:9000/ws')
client.connect()
logger.info("%d clients are connected" % i)
while True:
for ws in m.websockets.itervalues():
if not ws.terminated:
break
else:
break
time.sleep(3)
except KeyboardInterrupt:
m.close_all()
m.stop()
m.join()
```
一旦根据echo_cherrypy_server示例创建了这些例子,请将浏览器指向http://localhost:9000/并输入消息。 它将被广播给所有的连接。
当链接关闭时,它的连接将自动从管理器中删除,因此不用刻意的删除它。
**注意**
```CherryPy和wsgiref服务器内部使用管理器来处理连接的Websockets。 代理服务器仅依赖于gevent服务。```
翻译者:兰玉磊
博客:http://www.lanyulei.com