Python:如何创建一个并发安全的可重入上下文管理器,它在每个上下文中都是不同的

时间:2017-12-14 08:25:34

标签: python concurrency contextmanager reentrancy

我希望有一个对象conManager,这是一个reentrant context manager实例,每当我进入和退出其上下文时,它都会打印一个数字,但该数字必须比一个数字高一个。 previus上下文(从0开始)。

示例:

with conManager:
    print("Afirst")
    with conManager:
        print("Asecond")
        with conManager:
            print("third")
        print("Bsecond")
    print("Bfirst")

预期输出:

0
Afirst
1
Asecond
2
third
2
Bsecond
1
Bfirst
0

到目前为止,我唯一的解决方案是一个包含堆栈的类,但这不是并发安全的。有没有并发安全的解决方案?

编辑:正如Sraw指出的那样,当我指的是并发安全时,我说线程安全,相应地改变了问题。

1 个答案:

答案 0 :(得分:0)

我能想到的唯一解决方案是覆盖conManager的__call__,以便返回一个上下文管理器,但我宁愿有一个更清洁,没有 - 呼叫使用。