asyncio'future属于与指定为loop参数的循环不同的循环'

最近,我一直在尝试找出Python中的异步处理方式,但似乎无法完全理解它的结构方式。我已经习惯了Java已经实现的系统,您基本上可以使用runnable来做任何您想做的事,而且它确实可以工作。

基本上,我想制作一个同时运行flask和另一个Websocket服务器的应用程序,并使用flask作为服务器和活动连接的控制面板(有点像仪表板)。我设法使两个进程都运行了,但现在需要直接调用异步函数,但似乎不能这样做。

我有一个控制器类来处理传入连接,如下所示:

class SessionController:
    app_controller = None
    app = None
    sessions = dict()

    def __init__(self,app_controller: 'AppController'):
        self.app_controller = app_controller

    async def start(self):
        self.app = await websockets.serve(
            self.connect,'0.0.0.0',8887,subprotocols=[Subprotocol('ocpp1.6')]
        )
        await self.app.wait_closed()

    async def connect(self,websocket,path):
        point_id = str(uuid.uuid1())
        cp = Session(point_id,websocket)
        try:
            self.register(cp)
            await cp.start()
        except ConnectionClosedError:
            print("Connection reset")
        finally:
            self.unregister(cp)

    def register(self,cp):
        print("Client {0}:{1}#{2} connected".format(cp.websocket.host,cp.websocket.port,cp.point_id))
        self.sessions[cp.charge_point_id] = cp

    def unregister(self,cp):
        print("Client {0}:{1}#{2} disconnected".format(cp.websocket.host,cp.point_id))
        self.sessions.pop(cp.point_id)

    def end_session(self,point_id):
        cp = self.sessions.get(point_id)
        cp.close()
        self.unregister(cp)

现在,当我建立连接时,它可以正常工作,该会话已创建并在会话映射中注册。但是,当我尝试使用活动会话的ID调用end_session时,会收到错误RuntimeWarning: coroutine 'WebSocketCommonProtocol.close' was never awaited self.websocket.close()。该代码仍然可以正常运行,但当然最好不要出现错误。

在进行一些在线搜索之后,人们建议我尝试asyncio并使用循环来运行该方法。我使用以下代码进行了此操作:

loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(self.websocket.close())

这给了我以下错误:The future belongs to a different loop than the one specified as the loop argument

我只是无法掌握python处理异步的方式,有没有办法我可以无误地调用函数?

xiaozhidetiankong 回答:asyncio'future属于与指定为loop参数的循环不同的循环'

首先,如果要运行Web服务器并提供Web套接字,则可以使用ASGI服务器,例如FastAPI(https://fastapi.tiangolo.com/)。

还请注意,Flask是WSGI服务器,将在单独的线程中处理每个请求。如果使用事件循环,则事件循环在线程本地。因此,在组合多线程和事件循环时要小心。

由于您的代码示例不包含Session类,因此我无法确切指出您的问题。

本文链接:https://www.f2er.com/3111348.html

大家都在问