簡體   English   中英

中斷python websocket服務器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM