我正在处理一个应用程序。在哪里使用python websockets。现在,我需要异步运行并在不同端口上侦听的UDP和WS。
我无法执行此操作,因为WS recv()无限期等待,直到收到一条消息为止。消息将被接收并推入队列。我需要UDP才能接收并推送到同一队列。下面的此类仅实现websocket。我需要另一个带有UDP的类,并且两个类实例都异步运行。
import websockets
import json
from sinric.command.mainqueue import queue
from sinric.callback_handler.cbhandler
import CallBackHandler
from time import sleep
class SinricProSocket:
def __init__(self, apiKey, deviceId, callbacks):
self.apiKey = apiKey
self.deviceIds = deviceId
self.connection = None
self.callbacks = callbacks
self.callbackHandler = CallBackHandler(self.callbacks)
pass
async def connect(self): # Producer
self.connection = await websockets.client.connect('ws://2.5.2.2:301',
extra_headers={'Authorization': self.apiKey,
'deviceids': self.deviceIds},
ping_interval=30000, ping_timeout=10000)
if self.connection.open:
print('Client Connected')
return self.connection
async def sendMessage(self, message):
await self.connection.send(message)
async def receiveMessage(self, connection):
try:
message = await connection.recv()
queue.put(json.loads(message))
except websockets.exceptions.ConnectionClosed:
print('Connection with server closed')
async def handle(self):
# sleep(6)
while queue.qsize() > 0:
await self.callbackHandler.handleCallBacks(queue.get(), self.connection)
return
答案 0 :(得分:1)
感谢您在评论中的时间。我通过在2个不同的守护程序线程中运行WS和UDP实例解决了这个问题。
答案 1 :(得分:1)
解决此问题的一种好方法是使用线程。您可以接受一条消息并将其放入队列,然后在另一个线程上处理该队列。