Python 如何从芹菜/Django传输物联网信号?

Python 如何从芹菜/Django传输物联网信号?,python,django,redis,celery,django-channels,Python,Django,Redis,Celery,Django Channels,我的物联网设备每秒生成10个数据点(一个数据点中有16个数字)。我想将这些数据流式传输到web应用程序中,并将其显示为实时图形 我使用Django作为后端,芹菜/Redis用于后台任务,通道用于套接字连接 芹菜任务 @共享任务 def start_eeg_流(房间组名称、房间名称): 通道层=获取通道层() redis\u uri=config('redis\u URL') 主机,密码=redis_uri.split('@')[1]。split(':')[0],redis_uri.split('

我的物联网设备每秒生成10个数据点(一个数据点中有16个数字)。我想将这些数据流式传输到web应用程序中,并将其显示为实时图形

我使用Django作为后端,芹菜/Redis用于后台任务,通道用于套接字连接

芹菜任务
@共享任务
def start_eeg_流(房间组名称、房间名称):
通道层=获取通道层()
redis\u uri=config('redis\u URL')
主机,密码=redis_uri.split('@')[1]。split(':')[0],redis_uri.split('@')[0]。split(':')[2]
r=redis.redis(主机=主机,密码=密码)
pub_sub=r.pubsub()
发布订阅(f'EEG:{room_name})
r、 套装(房间名称,1)
对于pub_sub.listen()中的消息:
如果消息和消息['type']='message':
#对这个消息做点什么
异步到同步(通道层。组发送)(
房间组名称,
{
'type':'socket_message',
'有效载荷':{“类型”:“EEG_点”,“值”:str(消息['data'])}
}
)
如果不是int(r.get(房间名称)):
打印('正在停止eeg流…')
打破
Django consumers.py
导入json
从asgiref.sync导入异步到同步
从channels.generic.websocket导入WebsocketConsumer
从.tasks导入开始\u脑电\u流,停止\u脑电\u流
类LiveDataConsumer(WebsocketConsumer):
定义初始化(自)->无:
super()。\uuuu init\uuuuu()
self.consumer=无
def连接(自):
self.room\u name=self.scope['url\u route']['kwargs']['room\u name']
self.room\u group\u name='组\u%s'%self.room\u name'
#加入房间小组
异步到同步(self.channel\u layer.group\u add)(
self.room\u group\u name,
self.channel\u名称
)
self.accept()
self.send(text_data=json.dumps({'value':'Connected','type':'CONN_SUCCESS}))
def断开连接(自身、关闭_代码):
#离开房间组
停止\u eeg\u流(自身房间\u名称)
异步到同步(self.channel\u layer.group\u discard)(
self.room\u group\u name,
self.channel\u名称
)
#从WebSocket接收消息
def接收(自身、文本数据):
data_json=json.loads(文本_数据)
#向房间组发送消息
异步到同步(self.channel\u layer.group\u send)(
self.room\u group\u name,
{
'type':'socket_message',
“有效负载”:数据
}
)
#从房间组接收消息
def套接字_消息(自身、事件):
data_json=event['payload']
如果(data_json['type']==“START_EEG”):
启动\u eeg\u流延迟(self.room\u组\u名称、self.room\u名称)
elif(数据json['type']==“EEG_点”):
打印(“发送…”)
self.send(text\u data=json.dumps(data\u json))
elif(data_json['type']==“STOP_EEG”):
停止\u eeg\u流(自身房间\u名称)
整个流程如下所示:

  • 前端启动WebSocket连接并要求服务器启动流
  • Django接受此请求并为流式处理添加后台任务
  • 物联网设备开始向Redis发送数据点
  • 芹菜工人订阅Redis pub sub并将数据点发送到频道,而频道又将数据点发送到前端
  • 然而,从芹菜工作者到频道有太多的延迟(~2000ms),我不知道为什么。 请建议一个更好的架构。我应该使用线程吗