在 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 连接吗?还是我应该在一个连接中完成所有事情?