我正在制作类似于任务调度程序,使用发电机作为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
>>>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top