我正在做类似任务调度程序的事情,使用生成器作为协程。在下面的代码中,我需要确定性地执行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/

10-13 07:22