with上下文管理器执行顺序
MyAsyncContextManager() 是在 async with MyAsyncContextManager() as manager: 语句中创建的对象。它的 实例化 是在 async with 语句执行时的第一步,在进入异步上下文之前,具体执行时机如下:
-
实例化
MyAsyncContextManager():
当 Python 解析async with MyAsyncContextManager() as manager:语句时,首先会创建MyAsyncContextManager的一个新实例。这个对象会被赋给manager变量,供async with语句块内的代码使用。 -
调用
__aenter__方法:
在实例化对象之后,程序会自动调用MyAsyncContextManager的__aenter__()异步方法。此时,async with语句会挂起,等待__aenter__()方法的执行完成。这是进入上下文的过程,你可以在__aenter__()中执行需要的异步操作(例如连接数据库、进行网络请求等)。 -
执行
async with块中的代码:
一旦__aenter__()方法完成并返回控制权,程序就会进入async with语句块内的代码。在这个代码块内,程序会执行你写的异步任务。如果需要等待某个异步操作的结果,你会使用await。 -
调用
__aexit__方法:
当async with语句块内的代码执行完成,或者如果在块内抛出了异常,Python 会调用MyAsyncContextManager的__aexit__()方法。这是退出上下文的过程,通常用于清理工作,比如关闭资源、释放连接等。__aexit__()是一个异步方法,执行完后,async with语句会结束,程序会继续执行。
总结:
MyAsyncContextManager()通过async with语句创建并初始化。它会立即实例化,但接下来会调用__aenter__()进行异步操作,直到进入上下文。__aenter__()和__aexit__()的执行是由async with控制的,它们的执行顺序和async with块内的异步代码执行顺序是分开的。

浙公网安备 33010602011771号