【发布时间】:2019-01-31 18:48:37
【问题描述】:
我想将 python websockets 包的功能封装到一个类中,代表一个传感器协调器。这样做的目的是允许我创建一个协调器对象,并且只让服务器在需要时持续存在。不幸的是,我无法在网上找到任何类似的例子,并且到目前为止一直在挣扎。
我的代码如下:
import asyncio
import json
import logging
import websockets
logging.basicConfig()
class Coordinator(object):
def __init__(self, host='localhost', port=8080):
self.host = host
self.port = port
self.running = False
self.server = None
self.sensors = set()
def __enter__(self):
self.server = websockets.serve((self.ws_handler, self.host, self.port))
self.running = True
def __exit__(self, exc_type, exc_val, exc_tb):
# Gracefully stop serving
self.running = False
pass
def sensors_event(self):
return json.dumps({'type': 'sensors', 'count': len(self.sensors)})
async def notify_sensors(self):
if self.sensors:
message = self.sensors_event()
await asyncio.wait([user.send(message) for user in self.sensors])
async def register(self, websocket):
self.sensors.add(websocket)
await self.notify_sensors()
async def unregister(self, websocket):
self.sensors.remove(websocket)
await self.notify_sensors()
async def ws_handler(self, websocket):
try:
await self.register(websocket)
pass
finally:
await self.unregister(websocket)
if __name__ == '__main__':
with Coordinator() as coordinator:
pass
目前 websocket 服务器似乎没有启动,因为它在 netstat 上不可见。
是否可以在由协调器对象持有的单独(恶魔化)线程中运行服务器?
谢谢
【问题讨论】:
-
您使用的是什么操作系统? (我建议将该操作系统作为标签添加到您的问题中)
-
Mac OS Mojave,使用 Python 3.6.8
-
“这不起作用”也应该被解压。您想展示实际发生的情况并将其与预期行为进行比较。
-
已更新,感谢建设性的 cmets。如果还有什么我可以添加的,请告诉我:)
标签: python websocket python-asyncio macos-mojave