[英]Starting websocket server in different thread/event loop
我正在 python 3 中構建一個 Websocket 服務器應用程序。我正在使用這個實現: https://websockets.readthedocs.io/
基本上我想使用不同的線程在同一個進程中啟動服務器和客戶端。
這是我的代碼。 服務器似乎已啟動,但客戶端未連接。
我究竟做錯了什么?
紀堯姆
import asyncio
import websockets
import socket
from threading import Thread
async def hello(websocket, path):
name = await websocket.recv()
print(f"< {name}")
greeting = f"Hello {name}!"
await websocket.send(greeting)
print(f"> {greeting}")
def start_loop(loop):
asyncio.set_event_loop(loop)
loop.run_forever()
# Get host and port from config file
server_host = socket.gethostname()
server_port = 8081 # random.randint(10000, 60000)
print('server_host: ' + server_host)
# start a new event loop
new_loop = asyncio.new_event_loop()
t = Thread(target=start_loop, args=(new_loop,))
t.start()
start_server = websockets.serve(hello, server_host, server_port, loop=new_loop)
print("Server launched")
async def hello():
uri = "ws://{}:{}".format(server_host, server_port)
async with websockets.connect(uri) as websocket:
name = input("What's your name? ")
await websocket.send(name)
print(f"> {name}")
greeting = await websocket.recv()
print(f"< {greeting}")
asyncio.get_event_loop().run_until_complete(hello())
問題是您首先啟動了后台線程,然后嘗試使用它(作為一般原則,首先設置您的對象,然后啟動線程)。 另一個問題是您沒有像示例中那樣調用run_until_complete
。
所以要修復:
(1) 按照websockets例子修復start_loop
function,所以代碼變成
def start_loop(loop, server):
loop.run_until_complete(server)
loop.run_forever()
(2)在啟動后台線程之前設置你的服務器object:
new_loop = asyncio.new_event_loop()
start_server = websockets.serve(hello, server_host, server_port, loop=new_loop)
t = Thread(target=start_loop, args=(new_loop, start_server))
t.start()
最后,在嘗試連接到服務器之前,先休眠一會兒,讓服務器開始監聽(理想情況下,您會有更好的同步機制,但大多數情況下短暫休眠會起作用):
print("Server launched")
# give some time for server to start, before we try to connect
time.sleep(2)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.