## 管理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