Asyncio调用.create_task()时传入的函数未运行问题求助
Asyncio任务未按预期执行的原因分析
根因梳理
- 事件循环被同步操作完全阻塞
你代码中final函数末尾使用的是同步time.sleep(60),该操作会直接卡住运行事件循环的整个线程,导致事件循环没有空闲时段调度你通过create_task提交的异步任务。你另一项目中单次提交任务后事件监听器会立刻交还控制权给事件循环,因此任务可以正常调度执行。 - 协程未主动让出执行权
create_task仅会将异步任务加入事件循环的待调度队列,不会立刻触发任务执行。只有当前运行的协程遇到await主动让出CPU资源时,事件循环才会调度队列中的其他任务。你当前代码提交任务后没有任何await操作让出控制权,后续又执行同步sleep占死线程,因此提交的任务永远不会被执行。 - 异步API未加
await关键字
你timer_function中的asyncio.sleep(time_based_on_those_parameters)缺少await关键字,该行代码不会触发实际的异步等待,还会产生运行时警告,哪怕任务被调度也无法实现预期的定时逻辑。
正确Asyncio实现参考
import asyncio async def timer_function(my_parameters): print('Timer_Function called') # 异步API必须加await才能正常执行 await asyncio.sleep(time_based_on_those_parameters) # 执行剩余逻辑 async def final(parameters): # 执行前置逻辑 while True: # 执行相关逻辑 for i in range(my_range): if some_condition_a: # 高版本Asyncio推荐直接用asyncio.create_task提交任务 asyncio.create_task(timer_function(my_parameters)) print('Condition A met') if some_condition_b: asyncio.create_task(timer_function(some_different_parameters)) print('Condition B met') # 用异步sleep代替同步sleep,主动让出控制权给事件循环 await asyncio.sleep(60) if __name__ == "__main__": # 通过asyncio.run启动事件循环执行主协程 asyncio.run(final(your_parameters))
内容的提问来源于stack exchange,提问作者PyrooKil
相关产品推荐
相关产品推荐

