如何在非异步函数中调用异步函数(无需修改目标函数)
在非异步函数中执行异步函数的解决方案
因为你不能修改maze_move为异步函数,可通过获取当前asyncio事件循环来实现异步函数的调用,具体有两种常用方案:
1. 后台异步调度(不阻塞当前流程)
如果不需要等待异步函数执行完成,仅需让其在后台运行,使用loop.create_task()将异步函数包装成任务提交给事件循环:
import asyncio async def no_stop(): # some logic await asyncio.sleep(4) print("no_stop执行完毕") async def stop(stop_time): await asyncio.sleep(stop_time) # some logic print(f"stop({stop_time})执行完毕") def maze_move(): # 获取当前运行的事件循环 loop = asyncio.get_running_loop() # 提交异步任务到循环,后台执行 loop.create_task(no_stop()) loop.create_task(stop(1.5)) # 原main及启动代码保持不变 async def main(websocket): global data_from_client, data_from_server, power_l, power_r get_params() get_data_from_server() get_data_from_client() while True: msg = await websocket.recv() allow_data(msg) cheker(data_from_client) data_from_server['IsBrake'] = data_from_client['IsBrake'] data_from_server['powerL'] = power_l data_from_server['powerR'] = power_r await websocket.send(json.dumps(data_from_server)) print(data_from_client['IsBrake']) start_server = websockets.serve(main, 'localhost', 8080) asyncio.get_event_loop().run_until_complete(start_server) asyncio.get_event_loop().run_forever()
这种方式不会阻塞maze_move的执行,异步函数会在事件循环的空闲时段自动运行。
2. 同步等待执行(阻塞到异步函数完成)
如果需要等待异步函数执行完毕后再继续maze_move的后续逻辑,使用loop.run_until_complete():
def maze_move(): loop = asyncio.get_running_loop() # 等待no_stop执行完毕,会阻塞当前线程 loop.run_until_complete(no_stop()) # 再等待stop执行完毕 loop.run_until_complete(stop(1.5))
注意:这种方式会阻塞调用maze_move的线程,直到异步函数执行结束,需根据业务场景选择使用。
关键注意点
- 确保调用
maze_move时,已有一个运行中的asyncio事件循环(你的代码中main已在事件循环内运行,所以调用maze_move时循环是存在的)。
内容的提问来源于stack exchange,提问作者Калашников Ян
相关产品推荐
相关产品推荐

