gpt4 book ai didi

python - 废弃发电机持有的资源会怎样?

转载 作者:太空狗 更新时间:2023-10-30 02:51:47 25 4
gpt4 key购买 nike

我有一个生成器函数,它从文件中读取行并将它们解析为对象。这些文件太大而无法考虑将整个文件处理成一个列表,这就是我使用生成器而不是列表的原因。

我很担心,因为在调用生成器时,我的代码有时会出错。如果它找到了它正在寻找的东西,它可以选择在从文件中读取每个对象之前停止。我真的不明白被遗弃的生成器发生了什么,或者更重要的是我不知道打开的文件句柄发生了什么。

我想在这里避免资源泄漏。


示例代码:

def read_massive_file(file_path)
with open(file=file_path, mode='r', encoding='utf-8') as source_file:
for line in source_file:
yield parse_entry(line)

for entry in read_massive_file(my_file):
if is_the_entry_i_need(entry):
break
else:
# not found
pass

我的问题是:上面的代码会让我的源文件保持打开状态,还是 python 会找到关闭它的方法?

我从 for 循环中消费的事实会改变什么吗?如果我为 read_massive_file() 手动获取迭代器并在放弃迭代器之前多次调用 next(),我会看到相同的结果吗?

最佳答案

这只会在 CPython 上及时释放资源。在这种情况下要真正小心资源释放,你必须做类似的事情

with contextlib.closing(read_massive_file(my_file)) as gen:
for entry in gen:
...

但我从未见过有人这样做。


当一个生成器在没有完全耗尽的情况下被丢弃时,生成器的__del__方法会向生成器抛出一个GeneratorExit异常,以触发__exit__方法和 finally block 。在 CPython 上,一旦循环中断并且对生成器的唯一引用被丢弃,就会发生这种情况,但在其他实现中,如 PyPy,它可能只在 GC 循环运行时发生,或者如果 GC 不运行则根本不会发生在程序结束之前。

在您的情况下,GeneratorExit 将触发文件关闭。可能会意外捕获 GeneratorExit 并继续运行,在这种情况下可能不会触发正确的清理,但您的代码不会那样做。

关于python - 废弃发电机持有的资源会怎样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54727804/

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