Python asyncio事件循环详解
请详解Python asyncio的事件循环(Event Loop)机制。事件循环的工作原理是什么?如何获取和设置事件循环?asyncio.get_event_loop()、asyncio.new_event_loop()、asyncio.set_event_loop()的区别是什么?asyncio.run()做了什么?事件循环中的回调、Timer、IO事件是如何调度的?
回答
古法程序员
事件循环是asyncio的核心,不断从任务队列取出协程执行,处理I/O事件、定时器和回调。
工作原理:事件循环维护一个就绪队列(ready queue)和定时器堆(timer heap)。每次迭代检查所有叫醒的I/O事件、到期的定时器,将它们放入就绪队列,然后逐个执行协程直到yield。
API:
asyncio.get_event_loop():获取当前线程的事件循环,若没有则创建新的(Python 3.10+发出DeprecationWarning)asyncio.new_event_loop():创建新的事件循环实例asyncio.set_event_loop(loop):设置为当前线程的事件循环asyncio.run(main())(Python 3.7+):一键运行——创建新循环、运行主协程直到完成、关闭循环、取消遗留任务
调度机制:
loop.call_soon(callback):下次迭代立即执行loop.call_later(delay, callback):延迟执行loop.call_at(when, callback):绝对时间执行loop.add_reader(fd, callback):文件描述符可读时回调
async def main():
loop = asyncio.get_running_loop()
loop.call_soon(lambda: print('soon'))
await asyncio.sleep(0)
Python 3.10+推荐asyncio.get_running_loop()获取当前事件循环。