【问题标题】:Interrupt python websocket server中断 python websocket 服务器
【发布时间】:2020-09-09 09:42:01
【问题描述】:

我目前正在努力解决“简单”的问题。 我想要一个 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()

loop.add_signal_handler(signum, callback, *args) 这样的异步信号处理程序对我来说不是一个选项,因为它们只在 Unix 上工作。

我目前得到的错误是从未等待过stop_listening 方法,这对我来说很有意义。所以我对修复我的代码示例不是很感兴趣,但更一般地说,如何才能实现我的目标,或者通常如何解决?

非常感谢您

【问题讨论】:

    标签: python windows websocket python-asyncio


    【解决方案1】:

    没关系,这个问题与这个问题有关:Why does the asyncio's event loop suppress the KeyboardInterrupt on Windows? 这实际上是 Windows 上 asyncio 的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-30
      • 2023-03-31
      • 1970-01-01
      • 2015-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多