[英]Interrupt python websocket server
我目前正在努力解決一些“簡單”的問題。 我想要一個 python WebSocket 服務器,它能夠被外部事件(例如命令行中的 Ctrl+C)關閉。
到目前為止,這是我的代碼:
PORT = 8765
class Server(object):
def __init__(self):
self.online_players = dict()
self.online_players_lock = asyncio.Lock()
self.websocket_server = None
async def add_online_player(self, id, player):
async with self.online_players_lock:
self.online_players[id] = player
async def remove_online_player(self, id):
async with self.online_players_lock:
if id in self.online_players.keys():
del self.online_players[id]
def start(self):
end = False
loop = asyncio.new_event_loop()
thread = threading.Thread(target=listen, args=(loop, self))
thread.start()
while not end:
try:
time.sleep(500)
except KeyboardInterrupt:
end = True
loop.call_soon_threadsafe(stop_listening, loop, server)
async def on_connect(websocket, path, server):
print("New user...")
id = await websocket.recv()
player = WebSocketPlayer(id, websocket, server)
await server.add_online_player(id, player)
# from this point on WebSocketPlayer class handles communication
await player.listen()
def listen(loop, server:Server):
asyncio.set_event_loop(loop)
bound_handler = functools.partial(on_connect, server=server)
start_server_task = websockets.serve(bound_handler, "localhost", PORT, ping_timeout=None, loop=loop)
start_server = loop.run_until_complete(start_server_task)
server.websocket_server = start_server
print("Server running ...")
loop.run_forever()
async def stop_listening(loop, server:Server):
await server.websocket_server.wait_close()
loop.stop()
loop.close()
if __name__ == "__main__":
server = Server()
server.start()
來自 asyncio 的信號處理程序,如loop.add_signal_handler(signum, callback, *args)
對我來說不是一個選擇,因為它們只適用於 Unix。
我目前得到的錯誤是從未等待過stop_listening
方法,這對我來說很有意義。 所以我對修復我的代碼示例不太感興趣,但更一般地說,如何實現我的目標,或者通常如何解決?
非常感謝您提前
沒關系,這個問題與這個問題有關: 為什么 asyncio 的事件循環會抑制 Windows 上的 KeyboardInterrupt? 這實際上是 Windows 上 asyncio 的錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.