簡體   English   中英

如何接收連續的 stream 數據

[英]How to receive continuous stream of data

我創建了一個 django-server(使用 django-channels),從中可以在連接客戶端的通道層上發送連續的 stream 數據。

下面的代碼代表客戶端,其中“generate.sepsis”將觸發服務器端的function在通道上發送json; 我只是從服務器接收所有傳輸的數據並將其打印到控制台中。

async def receive_data_from_start_sepsis():
    ws_pat=websocket.WebSocket()
    ws_pat.connect('ws://localhost:8000/sepsisDynamic/?token=1fe10f828b00e170b3a9c5d41fc168a31facefc3')
    #time.sleep(7)
    await ws_pat.send(json.dumps({
    'type':'generate.sepsis',
    'data': {
                "heart_rate": 55,
                "oxy_saturation": 26.5,
                "temperature": 50,
                "blood_pressure": 95.48,
                "resp_rate": 156,
                "mean_art_pre": 85,
                "user_id": 15 
            }
    }))
    #time.sleep(2)
    while True:
        greeting = await ws_pat.recv()
        print(f"< {greeting}")
        asyncio.sleep(2)

# asyncio.run(receive_data_from_start_sepsis())
try:
    asyncio.get_event_loop().run_forever()
finally:
    asyncio.get_event_loop().run_until_complete(receive_data_from_start_sepsis())

但我收到以下錯誤

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-6-9fdd3245dd6e> in <module>
     24 try:
---> 25     asyncio.get_event_loop().run_forever()
     26 finally:

~\anaconda3\lib\asyncio\base_events.py in run_forever(self)
    524         if self.is_running():
--> 525             raise RuntimeError('This event loop is already running')
    526         if events._get_running_loop() is not None:

RuntimeError: This event loop is already running

During handling of the above exception, another exception occurred:

RuntimeError                              Traceback (most recent call last)
<ipython-input-6-9fdd3245dd6e> in <module>
     25     asyncio.get_event_loop().run_forever()
     26 finally:
---> 27     asyncio.get_event_loop().run_until_complete(receive_data_from_start_sepsis())

~\anaconda3\lib\asyncio\base_events.py in run_until_complete(self, future)
    568         future.add_done_callback(_run_until_complete_cb)
    569         try:
--> 570             self.run_forever()
    571         except:
    572             if new_task and future.done() and not future.cancelled():

~\anaconda3\lib\asyncio\base_events.py in run_forever(self)
    523         self._check_closed()
    524         if self.is_running():
--> 525             raise RuntimeError('This event loop is already running')
    526         if events._get_running_loop() is not None:
    527             raise RuntimeError(

RuntimeError: This event loop is already running

但是當服務器上的異步代碼完成其發送數據的(迭代)時; 套接字像這樣接收所有數據。 (這是發送的第一個數據項。)

{"type": "echo.message", "data": {"id": 147, "heart_rate": 155.0, "oxy_saturation": 150.0, "temperature": 43.0, "blood_pressure": 94.0, "resp_rate": 174.0, "mean_art_pre": 186.0, "patient": 10}}

django 中的異步 function 是:-

async def generating_patient_sepsis(self, message):
        # get the data from message
        data = message.get('data')
        print(f"THE INITIAL DATA {data}")
        # get the patient's id
        get_pat_id_in_data = await self._convert_user_id_to_patient_id(data)
        data = get_pat_id_in_data
        while True:
            time.sleep(5)
            await asyncio.sleep(1)
            # random sepsis data generated and `data` variable is mutated
            data.update({'heart_rate': random.randint(24, 200)})
            data.update({'oxy_saturation': random.randint(24, 200)})
            data.update({'temperature': random.randint(24, 200)})
            data.update({'blood_pressure': random.randint(24, 200)})
            data.update({'resp_rate': random.randint(24, 200)})
            data.update({'mean_art_pre': random.randint(24, 200)})
            print(f"THE DATA  --> {data}")
            # serializing and saving the data
            x = await self.serializer_checking_saving_data(data)
            # send the data to the channel
            await self.channel_layer.group_send(
                group=self.pat_grp_id,
                message={
                    'type': 'echo.message',
                    'data': x
                }
            )

我還想了解如何在 javascript 中接收相同的數據,以便我可以以動態圖表的方式表示變化;

在此處輸入圖像描述

測試失敗的原因

greeting = await ws_pat.recv()

是因為 websocket 接收 function 是同步 function 並且我試圖等待它。 如果我選擇刪除 await 關鍵字,它將收到 stream 數據,但它僅包含 json-data 的 stream 中的第一個值。

我能夠接收這些 json 數據的方式是定義一個異步的 function 並接收 websocket 數據; 所以每當 websocket 數據將從服務器廣播。

async def receive_sepsis(ws_pat):
    return ws_pat.recv()

這個實現的問題是廣播的事件循環永遠不會完成,因為while循環是True; 因此,從服務器廣播到組的所有 json 數據(即self.pat_grp_id )在

await self.channel_layer.group_send(<grp-name>,<message>)

誰能幫助我,我應該如何實際工作;
我只想將患者和醫生連接到同一個組(即患者 model 中的 grp_id 屬性,這是一個 UUID 字段); 一旦連接,患者將在 websocket 上請求“start_diagnosis”; 這將生成疾病的偽隨機數據; 保存在數據庫中,返回相同數據的序列化版本,然后將其廣播到具有患者 grp_id 的組名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM