我正在一个python项目中使用websockets。websocket正在线程中运行,并从父线程获得2queue's。我使用javascript连接到websocket服务器。在
我能够通过self.ssi.get(True)
从父线程获取消息,并将它们传递给javascript websocket客户端。在
但我无法接收客户的信息。当我使用zaproxy时,我可以看到消息通过。在websocket服务器上,我还可以看到数据包到达接口。Python不会抛出错误,logger.setLevel(logging.DEBUG)
不会以我能够看到的方式显示消息的到达方式。在
我一直试图解决这个问题,但我已经没有办法找到问题,任何帮助都欢迎。在
Python websocket服务器:
import websockets
import logging
import asyncio
import ssl
class websocket:
def __init__(self,ssi,sso):
self.ssi = ssi
self.sso = sso
logger = logging.getLogger('websockets')
logger.setLevel(logging.DEBUG)
# logger.addHandler(logging.FileHandler('debug.log'))
logger.addHandler(logging.StreamHandler())
sslc = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
sslc.load_cert_chain(
'keys/wss.server.crt',
'keys/wss.server.key')
loop = asyncio.new_event_loop()
wsrv = websockets.serve(
self.handler,
host='0.0.0.0',
port=9000,
ssl=sslc,
loop=loop)
loop.run_until_complete(wsrv)
loop.run_forever()
async def handler(self, wss, path):
consumer_task = asyncio.ensure_future(self.consumerHandler(wss, path))
producer_task = asyncio.ensure_future(self.producerHandler(wss, path))
done, pending = await asyncio.wait(
[consumer_task, producer_task],
return_when=asyncio.FIRST_COMPLETED,)
for task in pending:
task.cancel()
async def producerHandler(self, wss, path):
while True:
msg = await self.producer()
await wss.send(str(msg))
async def consumerHandler(self, wss, path):
async for msg in wss:
await self.consumer(msg)
async def producer(self):
return self.ssi.get(True)
async def consumer(self, msg):
self.sso.put(msg.data)
Javascript客户端:
^{pr2}$
我认为问题是您混合了
queue
库和asyncio.queue
的用法。在queue
是线程安全的,因此是线程之间通信的良好机制,但它没有异步API,因此当您调用self.ssi.get(True)
时,您阻塞了websocket线程,这将阻止任何其他websocket代码的运行。在asyncio.queue
有您想要的API(您可以await queue.get()
),但不幸的是它不是线程安全的(它是为单线程异步应用程序设计的)。在您可以使用
loop.run_in_executor
等待阻塞queue.get(True)
调用。请参阅此处的示例https://carlosmaniero.github.io/asyncio-handle-blocking-functions.html相关问题 更多 >
编程相关推荐