最近,我一直在尝试找出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处理异步的方式,有没有办法我可以无误地调用函数?