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