一段时间以来,我一直在同一个问题上作斗争,我发现取得任何有意义的进步变得越来越困难。通过写这个问题,我希望找到一个潜在的解决方案,或者收集一些新的想法来继续尝试自己。
从总体上讲,这是我想要达到的目标:
我想模拟一个小规模的物联网部署,大致包括 50个设备。我可以使用基于Websocket的流式API访问传感器读数,频率大约为每分钟一个读数(每个传感器)。
除了处理此数据外,每个传感器还应与集中式协调器节点通信(全双工),该节点负责聚合数据并分发结果。
希望此描述足以说明我要达到的目标。
为了便于测试,我想通过封装操作(发送/接收/广播)的简单接口将每个组件建模为一个对象。
class Sensor(object):
Receive : Receive sensor readings from the streaming API
Send : Send data to the coordinator
Receive : Receive data from the coordinator
class Coordinator(object)
Send : Send data to a specific sensor
Broadcast : Send data to all connected sensors
Receive : Receive data from a connected sensor
到目前为止,我的大部分工作都使用了asyncio和websockets库。
最新方法
我最近花了更多时间阅读有关asyncio框架的信息,并尝试了以下操作。这里的想法是,通过将共享的事件循环(调度程序)注入到每个对象中,我可以实现我想要的抽象。
传感器
import asyncio
from Client import Client
from Readings import Reading
class Sensor(object):
def __init__(self):
self.scheduler = asyncio.get_event_loop()
self.urban_api = None # Websocket streaming API
self.readings = Reading(self.scheduler, self.urban_api)
self.coordinator = Client(self.scheduler, host='localhost', port=8080)
self.scheduler.create_task(self.repetitive_message())
try:
self.scheduler.run_forever()
except KeyboardInterrupt:
pass
async def called_on_new_reading():
# Called on receipt of new reading.
@staticmethod
async def repetitive_message():
while True:
print('Sensor performing work')
await asyncio.sleep(2)
if __name__ == '__main__':
sensor = Sensor()
阅读-处理流式API
from websockets import connect
class Reading(object):
def __init__(self, scheduler, urban_api):
self.scheduler = scheduler
self.urban_api = urban_api
self.scheduler.create_task(self.receive())
async def receive(self):
async with connect(self.urban_api) as websocket:
async for message in websocket:
print(message)
自从切换到websockets以来,我在实现协调器方面未取得任何进展,但是我希望意图很明确。
我有几个问题:
我无法找到任何OOP异步示例-也许我缺少了什么?
我很高兴这篇文章很长,而且缺少部分内容,但是任何反馈或指点将不胜感激。