异步上下文管理器,用于对上下文切换执行操作

时间:2017-04-04 16:17:20

标签: python asynchronous contextmanager

我想为每次执行“移动”到另一个上下文时调用函数的异步函数创建一个上下文管理器

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,并且显然每次执行“切换”到另一个上下文时恢复上一个工作目录

最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

与您对该名称的期望相反,上下文管理器作为一个概念与上下文切换没有任何关系。

常规上下文管理器和异步上下文管理器都不会被告知事件循环"上下文切换"。上下文管理器无法检测到事件循环将开始运行另一个协程,并且当发生这种情况时,上下文管理器无法执行代码。