我想为每次执行“移动”到另一个上下文时调用函数的异步函数创建一个上下文管理器
E.g。
import os
import asyncio
class AsyncContextChangeDir:
def __init__(self, newdir):
self.curdir = os.getcwd()
self.newdir = newdir
async def __aenter__(self):
os.chdir(self.newdir)
async def __aexit__(self, exc_type, exc_value, traceback):
os.chdir(self.curdir)
async def workon_mypath():
async with AsyncContextChangeDir("/tmp"):
print("working in /tmp context manager, cwd:" + os.getcwd()) # /mypath
await asyncio.sleep(100)
print("working in /tmp context manager, cwd:" + os.getcwd()) # ???
async def workon_someotherpath():
await asyncio.sleep(10)
os.chdir("/home")
print("working in other context cwd:" + os.getcwd())
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(
workon_mypath(),
workon_someotherpath()))
我希望第二次打印打印/mypath
,并且显然每次执行“切换”到另一个上下文时恢复上一个工作目录
最好的方法是什么?
答案 0 :(得分:0)
与您对该名称的期望相反,上下文管理器作为一个概念与上下文切换没有任何关系。
常规上下文管理器和异步上下文管理器都不会被告知事件循环"上下文切换"。上下文管理器无法检测到事件循环将开始运行另一个协程,并且当发生这种情况时,上下文管理器无法执行代码。