是的,GC正在调用 __del__
发电机的清洁钩,进而提高 GeneratorExit
在发电机功能中以退出发电机(通过调用 generator.close()
).
这意味着上下文经理 __exit__
每当从内存中清除生成器函数时,都会调用钩子。
您可以首先手动关闭发电机 generator.close()
:
b.close()
题
我正在制作类似于任务调度程序,使用发电机作为Coroutines。在以下代码中,我需要执行 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__
发电机的清洁钩,进而提高 GeneratorExit
在发电机功能中以退出发电机(通过调用 generator.close()
).
这意味着上下文经理 __exit__
每当从内存中清除生成器函数时,都会调用钩子。
您可以首先手动关闭发电机 generator.close()
:
b.close()
其他提示
您必须导致发电机退出。如果发电机的性质要永远看起来,则可以使用gen.throw()在发电机中提出异常。
实际上,我只是查看了发电机的规范,并且它们具有一个close()的方法(它提高了生成器内部的generatorexit()例外。任何上下文经理都会调用他们的 出口 方法。发电机会吃例外,因此您无需将CLOSE()调用()呼叫中的try块:
>>> b= bar()
>>> b.next()
setup
'bar'
>>> b.close()
cleanup
>>>