Откройте веб-сокет в Python и оставьте его открытым - PullRequest
1 голос
/ 11 апреля 2020

Я пытаюсь создать сценарий, который подключается к веб-сокету, что-то записывает в него и затем сохраняет его, не закрывая соединение, потому что в следующую секунду я напишу снова.

Я следовал за документы библиотеки "websockets" для Python, но я не могу понять, как это сделать, потому что я вижу в мониторе сервера веб-сокетов, как этот сценарий подключается и отключается каждую секунду, и это не должно быть , но я не знаю, как это сделать.

Это поведение для async with websockets.connect(f"ws://{host}:{port}") as ws:, но я не уверен.

Я использую python3 .7 и библиотеку websockets8.1

#!/usr/bin/python3
# -*- coding: UTF-8 -*-

# Libraries used
import time
import asyncio
import websockets

# Function to write in websocket
async def produce(message: str, host: str, port: int) -> None:
    async with websockets.connect(f"ws://{host}:{port}") as ws:
        await ws.send(message)
        print("> {}".format(message))
        response = await ws.recv()
        print("< {}".format(response))



# Websocket parameters
wsHost='localhost'
wsPort=54682


def main():
    iteration = 0

    while True:
        try:
            iteration = iteration + 1
            asyncio.run(produce(str(iteration), wsHost, wsPort))
            time.sleep(1)

        except Exception as e:
            print(e)


if __name__ == "__main__":
    main()

1 Ответ

0 голосов
/ 27 апреля 2020

С очередью у меня все работает, связь между сообщениями сохраняется, но теперь я не могу освободить основную l oop

Я не знаю, как сделать def main() с основным потоком скрипта и внутреннего потока с дескриптором websocket.

Это лучшее, что я получаю до сегодняшнего дня

#!/usr/bin/python3
# -*- coding: UTF-8 -*-

import asyncio
import websockets
import time

wsHost='localhost'
wsPort=54682


async def ws_produce(host: str, port: int, queue) -> None:
    async with websockets.connect(f"ws://{host}:{port}") as ws:
        print("Starting corutine 2")
        while True:
            message = str(await queue.get())
            if message != "":
                print(f"C - Sending: '{message}' @ {host}:{port}")
                await ws.send(message)
                #await ws.recv()
                queue.task_done()                                       # Notify the queue that the "work item" has been processed.


async def main():
    print("Starting corutine 1")
    queue = asyncio.Queue()                                             # Object to store the queue. Default FIFO
    task = asyncio.create_task(ws_produce(wsHost, wsPort, queue))       # ¿?
    counter = 0
    while True:
        try:
            start_time = time.time()

            #print(f"A - Queue empty? {queue.empty()}")
            counter = counter + 1                                       # Increase 1 point to the counter
            queue.put_nowait(counter)                                   # Put data into the queue.
            #print(f"B - Queue empty? {queue.empty()}")
            await queue.join()                                          # Wait until the queue is fully processed.
            #print(f"D - Queue empty? {queue.empty()}")

            print("Tiempo ejecucion: " + str(round((time.time() - start_time)*1000,2)) + " ms\n")

            await asyncio.sleep(1)                                      # Sleep for the "1" seconds.
            print("\n")
        except Exception as e:
            print(e)
        except KeyboardInterrupt:
            print("Cerrado")
            time.sleep(0.3)
            return


if __name__ == "__main__":
    asyncio.run(main())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...