代码之家  ›  专栏  ›  技术社区  ›  galah92

使用同步API异步包装WebSocket

  •  0
  • galah92  · 技术社区  · 7 年前

    我用的是python websockets library 以创建websocket服务器。我的目标是出口 同步的 API,因为它将在python之外使用。

    因此,我需要,至少在一开始, start() stop() 方法。因此,为其创建websocket服务器类似乎是正确的。
    主要问题是,通过库创建(和启动)服务器的方法是 await 因此,应该鼓励采用这些方法 async ,我尽量避免。

    当我运行main()函数时,下面的代码非常有效。
    跑步的时候 server = WebsocketServer(); server.start(1234) 通过 ipython shell我似乎无法通过客户端代码连接。我错过了什么?

    class WebsocketServer():
    
        def __init__(self):
            self._server = None
    
        def start(self, port):
            start_server = websockets.serve(self._handle_client,
                                            host='localhost',
                                            port=port)
            self._server = asyncio.get_event_loop().run_until_complete(start_server)
    
        def stop(self):
            if self._server:
                self._server.close()
                self._server = None
    
        async def _handle_client(self, client, path):
            async for buffer in client:
                await self._handle_buffer(client, buffer)
    
        async def _handle_buffer(self, client, buffer):
            print(buffer)
            await client.send(buffer)
    
    def main():
        server = WebsocketServer()
        server.start(1234)
        asyncio.get_event_loop().run_forever()
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   bobah    7 年前

    IO环路的同步接口通过 tasks .调度方法返回一个可以在需要时同步等待的未来。这个 run an event loop 文档部分的底部有一个用于同步关机的组合。

    在iPython外壳内运行时,一个选项是为IO循环生成后台进程线程,并注册 atexit 回调以在shell退出时同步关闭IO循环。

    另一个选项是使用上面描述的UI事件循环集成点,偶尔为IO任务“借用”shell的线程(当然,仅适用于短任务) here 描述如何借用IO的shell线程。

        2
  •  0
  •   morten    4 年前

    您缺少主函数的最后一行。

    asyncio.get_event_loop().run_forever()
    

    循环未运行时不会发生任何事情。因此,除非运行循环,否则服务器不会运行。