gpt4 book ai didi

python-3.x - 在生成器中使用上下文管理器是否会导致资源泄漏?

转载 作者:行者123 更新时间:2023-12-05 02:58:31 24 4
gpt4 key购买 nike

我有一个从上下文管理器产生的函数:

def producer(pathname):
with open(pathname) as f:
while True:
chunk = f.read(4)
if not chunk:
break
yield chunk

当生成器被完全消耗时这不是问题,因为在最后一次迭代期间,生成器在 yield 语句之后恢复执行,并且循环中断并且我们很好地退出上下文管理器。

但是,如果生成器只被部分消耗,并且没有更多的消费者完全消耗它,生成器是否会永远保持暂停状态>?在那种情况下,我们将永远不会退出上下文管理器。这是否意味着该文件将在程序执行的其余部分保持打开状态?或者至少在生成器被垃圾收集之前?这是我应该自己处理的极端情况,还是我可以依靠 Python 运行时及时关闭悬挂的上下文管理器?


FWIW,我见过 Generator and context manager at the same timeHow to use a python context manager inside a generator但我认为他们并没有真正回答同一个问题。除非我错过了什么?

最佳答案

如果您未能使用整个生成器,则在生成器被垃圾回收之前不会清理上下文管理器,如果涉及引用循环,或者您在非 CPython 解释器上运行,这可能需要相当长的时间.

您可以通过关闭-ing generator-iterator 来解决这个问题;所有生成器函数都提供 a close method在生成的生成器迭代器上引发 GeneratorExit ;异常会从 with 语句等中冒出,以确保它们被确定性地正确清理。

要使其在保证的时间点发生,您可以 use contextlib.closing保证发电机本身的关闭:

 from contextlib import closing

with closing(producer(mypath)) as produced_items:
for item in produced_items:
# Do stuff, maybe break loop early

即使您中断返回或引发异常,控制produced_itemswith也会关闭它,这将依次为其中的with语句调用清理。

关于python-3.x - 在生成器中使用上下文管理器是否会导致资源泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58974675/

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