Python a problém s příjmem websocket

cizek.milan na seznam.cz cizek.milan na seznam.cz
Neděle Listopad 13 02:30:29 CET 2022


Ahoj,

nevím, jestli někdo bude vědět, ale už ses tím trápím dost dlouho a fakt
nevím.
Naimplementoval jsem si v pythonu wesocket server (import websockets) podle
příkladu.
Tento server běží v extra vlákně. Když přijme data od klienta, pak tato data
zkontroluje a vloží do Queue/SimpleQueue přes put().
V hlavním vlákně (main) pak mám nekonečnou smyčku, která hlídá velikost
fronty a případně vyčítá data přes get() a tato zpracovává.

Vedle toho jsem si napsal druhý skript websocket klienta, který mi do
serveru posílá zkušebně několik příkazů po sobě.
Ve skriptu serveru jsem si zapnul debug logování, tak vidím i co dělá ten
websocket server, resp. jestli a co přijímá.

Mám potvrzené, že do websocket serveru ta data dorazí (v logu vidím
read_frame a obsah), to zaloguje z daného vlákna.
https://snipboard.io/93Qx1i.jpg

Ale tím to skončí, data už se mi nevloží do mé fronty a vlastně si na ně v
tom vlákně nijak nešahnu / tam už o nich nevím / nenaplní se mi do data. (?)

Vůbec mě nenapadá, v čem může být problém. Nějaký nápad?

cmds_queue = queue.Queue()  # Queue/SimpleQueue

def bgWorker_WS():
    # create handler for each connection
    async def handler(websocket, path):
        data = await websocket.recv()

        # ověření, jestli jsme obdrželi validní příkaz se všemi hodnotami
        if isCommandValid(data):
            LOGGER.debug("received data match the defined protocol and will
be processed")

            LOGGER.debug("received command added to queue")
            cmds_queue.put(data);  # default: block=True, timeout=None

            await websocket.send("DEMO REPLY")
        else:
            LOGGER.error("received data does not match the defined protocol
and will not be processed!")

    loop = asyncio.new_event_loop()  # vytvoříme novou smyčku v tomto vlákně
    asyncio.set_event_loop(loop)

    start_server = websockets.serve(handler, "", 8001)
    loop.run_until_complete(start_server)
    loop.run_forever()

def isCommandValid(data):
    return True

if __name__ == '__main__':
    bgsk = threading.Thread(target=bgWorker_WS, daemon=True).start()

    while True:
        pass



Další informace o konferenci Hw-list