首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在coroutine close()上运行代码

在coroutine close()上运行代码
EN

Stack Overflow用户
提问于 2017-10-10 23:22:29
回答 1查看 1.6K关注 0票数 2

我正在编写大量使用协同机制的代码,我希望在关机时有可靠的行为。

假设我有一个协同器和一个上下文管理器:

代码语言:javascript
运行
复制
from contextlib import contextmanager

@contextmanager
def print_context_manager(text):
    print("Enter", text)
    yield
    print("Exit", text)

def coro():
    with print_context_manager("coro"):
        while True:
            print("Loop", (yield))

我可以这样用:

代码语言:javascript
运行
复制
c = coro()
next(c)
c.send("Hello ")
c.send("World!")
c.close()

不幸的是,据我所知,没有办法在c.close()上执行我自己的代码。尤其是coroutine中的上下文管理器从不打印"Exit coro“。

协同中的上下文管理器有什么意义?我必须手动想出一种方法来指示流的结束吗?那么,close()有什么意义呢?

参见本例:https://repl.it/M0XI/0

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-10 23:58:52

您的上下文管理器有一个bug。纠正它,当协同线关闭时,它将自动执行清理。

关闭协同线的工作方式是在协同线被挂起的地方提高GeneratorExit。如果with中的代码引发异常,则@contextlib.contextmanageryield点引发该异常。您的上下文管理器不处理这个问题,因此异常会阻止清理工作的运行。

如果您希望在异常情况下运行清理,则需要将yield包装为try--最后,并在finally中执行清理:

代码语言:javascript
运行
复制
@contextmanager
def print_context_manager(text):
    print("Enter", text)
    try:
        yield
    finally:
        print("Exit", text)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46677432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档