在Python中,是否会在while循环内引发Exception导致内存泄漏?

咖啡因迈克

我有以下代码片段让我思考

# Utlizing api_sess from the /token response  
# api_sess is a requests.Session() with Authorization header set with session token

products_resp = api_sess.get(
    f'{API_BASE}/products',
    params = {'type': 'Item'}
)

if products_resp.ok:
    while True:
        current_page = products_resp.headers.get('X-Current-Page', 1)
        total_pages = products_resp.headers.get('X-Total-Pages', 0)
        products_json = products_resp.json()
        for product in products_json:
            print(product['groupCode'], product['sku'], product['productStatus'])
        # Handle pagination
        if current_page < total_pages:
            products_resp = api_sess.get(
                f'{API_BASE}/products',
                params = {'type': 'Item', 'page': current_page + 1}
            )
            if not products_resp.ok:
                # Break out of while loop before raising error
                break
        else:
            break
    # Raise exception outside of while loop to prevent memory leak
    if not products_resp.ok:
        raise ValueException(f'Request Error {products_resp.status_code}')
else:
    raise ValueException(f'Request Error {products_resp.status_code}')

最初,我要去检查下一页请求响应raisewhile地方的异常,如下所示:

if current_page < total_pages:
    products_resp = api_sess.get(
        f'{API_BASE}/products',
        params = {'type': 'Item', 'page': current_page + 1}
    )
    if not products_resp.ok:
        raise ValueException(f'Request Error {products_resp.status_code}')
else:
    break

起初我什么都没想到,但是我开始怀疑是否会进行资源清理,因为while由于True条件的限制,错误会在无限循环内引发因此,为什么我不可避免地要重新设计我的逻辑以首先打破while循环,然后重新检查响应状态。

我认为,这种谨慎的方法并不像我想要的那样优雅,因为我正在重复检查响应状态。这引出我的问题:

将异常保持在while循环内是否安全,否则会导致内存泄漏?

我知道这个问题和场景看似微不足道,但是我想尽可能地在各个方面坚持最佳实践。在我进行谷歌搜索时(尽管我没有花费至少几个小时的时间),此问题并未得到有关如何处理此情况的任何适用解释。

切普纳

无论您是通过return还是通过未捕获的异常离开当前作用域,该对象上的引用计数都将减少。一个简单的例子:

import sys

a = "hello"

def foo(b):
    x = a
    print(f'x: {sys.getrefcount(x)}')
    if b:
        return
    else:
        raise Exception()

print(f'a: {sys.getrefcount(a)}')
foo(True)
print(f'a: {sys.getrefcount(a)}')

try:
    print(f'a: {sys.getrefcount(a)}')
    foo(False)
except Exception:
    pass
print(f'a: {sys.getrefcount(a)}')

确切的输出可能会有所不同,但是您应注意参考计数x要比的参考计数大1 a,后者在调用之前和之后保持不变foo

在这两种情况下,全局引用计数afoo调用都会增加,在foo退出(或try捕获异常语句完成之后)会减少。如果从未捕获到异常,则解释器仍然退出,从而引起内存泄漏的问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

BeginInvokeOnMainThread方法是否会循环并导致内存泄漏?

Task.Delay()循环是否会导致内存泄漏?

C ++ for循环导致内存泄漏?

如果引用仍然存在,是否不会在析构函数中删除指针会导致内存泄漏?

循环中的Estimator.predict导致TensorFlow中的内存泄漏

这个While-Foreach循环会导致托管内存泄漏吗?

setState 导致主题订阅内的内存泄漏

当此方法引发异常时,会导致内存泄漏吗?

python中的while循环内的while循环?

内核中的“ while” /“ for”循环导致CUDA内存不足错误?

Python Dict Switcher 导致内存泄漏

lwjgl中的缓冲utils导致内存泄漏

由于Netty中的ByteBuffers而导致的内存泄漏

这会导致c ++中的内存泄漏吗?

这会导致Go中的内存泄漏吗?

从向量中删除值导致的内存泄漏

简单查询导致Django中的内存泄漏

由于 Unity 中的 MapBox 导致内存泄漏

循环中的特征提取似乎导致pytorch中的内存泄漏

Haxe-从SWF库中循环播放动画动画片段会导致内存泄漏

重新初始化相同的指针时,是否在while循环中发生内存泄漏

将活动实例保存在片段中:是否会导致内存泄漏?

从WeakReference的get方法返回的强引用是否会导致AsyncTask onProgressUpdate中的内存泄漏?

使用方法pushViewController:animated:是否会导致iOS中的内存泄漏?

这种关闭是否会导致Node.js中的内存泄漏,还是编程错误?

防止Perl中的循环参考内存泄漏

NSRunAlertPanel导致内存泄漏

SwipeRefreshLayout导致内存泄漏

InputStream导致内存泄漏