gpt4 book ai didi

python - 在生成器内部时上下文管理器的 __exit__ 何时被触发?

转载 作者:太空狗 更新时间:2023-10-29 22:30:46 28 4
gpt4 key购买 nike

我正在制作类似任务调度程序的东西,使用生成器作为协程。在下面的代码中,我需要确定性地执行 print cleanup

从我的交互看来,将对象释放给垃圾收集器会导致上下文管理器退出。但是,我知道最好不要依赖 GC 的时间。真的是 GC 调用了 __exit__ 还是另一种机制?

我怎样才能严格地强制 print 'cleanup'

>>> from contextlib import contextmanager
>>> @contextmanager
... def foo():
... print 'setup'
... try:
... yield
... finally:
... print 'cleanup'
...
>>> def bar():
... with foo():
... while True:
... yield 'bar'
...
>>> b = bar()
>>> b.next()
setup
'bar'
>>> b = None
cleanup

最佳答案

是的,GC 正在调用生成器的 __del__ 清理钩子(Hook),这又会在生成器函数中引发一个 GeneratorExit 以退出生成器(通过调用 generator.close()).

这意味着上下文管理器 __exit__ Hook 将在生成器函数从内存中清除时被调用。

您可以先自己手动关闭生成器,使用 generator.close() :

b.close()

关于python - 在生成器内部时上下文管理器的 __exit__ 何时被触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19825106/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com