🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 管理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