Python 如何在WebSocket中使用多线程?
我正在尝试使用多线程的websocket()。我想要的是在程序继续运行时继续获取数据,但是,当我按照下面的代码执行时,服务器不会从客户端接收任何连接。我以前在主线程上运行过它,它运行得很好Python 如何在WebSocket中使用多线程?,python,multithreading,websocket,Python,Multithreading,Websocket,我正在尝试使用多线程的websocket()。我想要的是在程序继续运行时继续获取数据,但是,当我按照下面的代码执行时,服务器不会从客户端接收任何连接。我以前在主线程上运行过它,它运行得很好 async def hello(websocket, path): while True: data = await websocket.recv() print(data) await websocket.send(data) def betwee
async def hello(websocket, path):
while True:
data = await websocket.recv()
print(data)
await websocket.send(data)
def between_callback():
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
ws_server = websockets.serve(hello, '192.168.0.115', 8899)
loop.run_until_complete(ws_server)
loop.close()
if __name__ == "__main__":
_thread = threading.Thread(target=between_callback)
_thread.start()
# Do something in main thread
通常,在这些服务器/客户机程序中,您在主线程中接受连接,每个传入连接接收一个单独的其他线程。线程本身可能只是一个echo函数,但这种设计的巨大优势在于,您可以一次处理多个客户端,而不必等待另一个客户端收到它的响应。一个很好的方法是创建一个给定大小的线程池(比如说20),并在每个传入连接不是空的情况下从该池中分配一个线程。这样,您就可以在某种程度上控制使用了多少资源。查看
websockets
示例程序,您似乎缺少了一条语句,loop.run\u forever()
,这似乎起到了作用(为了测试,我还将IP地址更改为“localhost”):
def在_callback()之间:
loop=asyncio.new\u event\u loop()
asyncio.set\u event\u循环(循环)
ws_server=websockets.service(您好,'localhost',8899)
循环。运行_直到_完成(ws_服务器)
loop.run_forever()#缺少此项
loop.close()
演示程序
请注意更新的hello
函数,该函数避免了websockets.exceptions.ConnectionClosedOK:code=1000(确定),终止时无原因异常,我怀疑这是由于守护进程线程的终止引起的
导入WebSocket
导入线程
导入异步
异步def hello(websocket,路径):
websocket中数据的异步:
打印(f“已接收:{data}'”)
等待websocket.send(数据)
def在_callback()之间:
loop=asyncio.new\u event\u loop()
asyncio.set\u event\u循环(循环)
ws_server=websockets.service(您好,'localhost',8899)
循环。运行_直到_完成(ws_服务器)
loop.run_forever()#缺少此项
loop.close()
异步def发送\接收\消息(uri):
与websocket异步。作为websocket连接(uri):
等待websocket.send('这是一些文本')
reply=wait websocket.recv()
打印(f“回复为:{reply}'”)
def client():
loop=asyncio.new\u event\u loop()
asyncio.set\u event\u循环(循环)
循环。运行直到完成(发送接收消息('ws://localhost:8899'))
loop.close()
如果名称=“\uuuuu main\uuuuuuuu”:
#守护进程服务器线程:
server=threading.Thread(target=between\u回调,daemon=True)
server.start()
客户端=线程。线程(目标=客户端)
client.start()
client.join()
印刷品:
Received: 'This is some text.'
The reply is: 'This is some text.'
你的主线程是做什么的?它在连接线吗?@KlausD。它使用从websocket接收的数据来做其他事情。我只有一个客户端连接到我的websocket,在接收数据时,我需要在主线程中做其他事情。