Обновлять сервер каждые n секунд с помощью функции цикла каждые n секунд? Python Розетки - PullRequest
1 голос
/ 18 июня 2020

Я запускаю этот сервер, который получает данные. Однако я хочу, чтобы он обновлялся каждую секунду. Этот Asyncio l oop говорит, что он работает вечно, но он получает данные только один раз.

Какие циклы я могу выполнять, чтобы обновлять получение сообщений каждые n секунд, и где мне разместить эти циклы? Я пробовал Threading, For / While Loops и c, но, возможно, я размещал их не в тех местах.

Что мне делать?

import asyncio
    import websockets
    import socket

    UDP_IP = socket.gethostname()
    UDP_PORT = 5225

    sock = socket.socket(socket.AF_INET, # Internet
                         socket.SOCK_DGRAM) # UDP
    sock.bind((UDP_IP, UDP_PORT))

    while True:
        data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
        #print(str(data))


        x = 1

        async def echo(websocket, path):
            async for message in websocket:
                await asyncio.sleep(1)
                await websocket.send(str(data)) #FontWeight Value



        print(bytes(data))


        start_server = websockets.serve(echo, "localhost", 9090)


        asyncio.get_event_loop().run_until_complete(start_server)
        asyncio.get_event_loop().run_forever()
        #loop.run_forever(start_server)

1 Ответ

0 голосов
/ 19 июня 2020

Вы не можете использовать обычные сокеты в asyncio, потому что их блокировка recv останавливает событие l oop. Вам нужно использовать что-то вроде этого:

data = None

class ServerProtocol(asyncio.Protocol):
    def data_received(self, newdata):
        global data
        data = newdata

async def serve_udp():
    loop = asyncio.get_running_loop()
    server = await loop.create_server(ServerProtocol, UDP_IP, UDP_PORT)
    async with server:
        await server.serve_forever()

Затем вы должны интегрировать его с кодом обслуживания веб-сокета. Например:

async def ws_echo(websocket, path):
    async for message in websocket:
        await asyncio.sleep(1)
        await websocket.send(str(data))

async def main():
    asyncio.create_task(serve_udp())
    await websockets.serve(ws_echo, "localhost", 9090)
    await asyncio.Event().wait()  # prevent main() from returning

asyncio.run(main())
...