在 Python 中打开一个 websocket 并保持打开状态

Posted

技术标签:

【中文标题】在 Python 中打开一个 websocket 并保持打开状态【英文标题】:Open a websocket in Python and keep it open 【发布时间】:2020-04-10 23:25:29 【问题描述】:

我正在尝试制作一个连接到 websocket 的脚本,在其中写一些东西然后保留它,不关闭连接,因为下一秒,我会再写一次。

我遵循library "websockets" for Python 的文档,但我无法理解如何使它成为可能,因为我在 websocket 服务器监视器中看到这个脚本是如何每秒连接和断开连接的,它不应该是,但我没有知道怎么做。

此行为适用于 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】:

有了队列,我得到了它的工作原理,发送的消息之间的连接保持活动状态,但现在我无法释放主循环

我不知道如何使用脚本的主要流程和带有 websocket 句柄的后端线程来制作def main()

这是我到今天为止最好的结果

#!/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())

【讨论】:

以上是关于在 Python 中打开一个 websocket 并保持打开状态的主要内容,如果未能解决你的问题,请参考以下文章

Python程序中 import websocket 报错 No module named websocket

Azure 认知服务 - 使用 python 和 websockets 自定义语音

使用 websockets 时,我应该为每个不同的任务打开一个新的 websocket 连接吗?还是我应该在一个连接中完成所有事情?

Python在tkinter中发送websocket消息

如何在上下文管理器之外打开 websocket 连接?

在单个应用程序中打开多个 websocket 连接