为什么CPython退出时不会释放全部内存?

为什么CPython退出时不会释放全部内存?

CPython是Python的默认和最广泛使用的解释器或实现。它是原始的Python版本,可以理解使用Python规范编写的代码。

Python非常在意在退出时清理内存,并尝试销毁每个对象,但不幸的是,从Python模块的全局命名空间引用的对象在Python退出时并不总是解除分配。原因是存在循环引用。还有一些由C库分配的内存位是无法释放的。使用atexit模块在解分配时强制Python删除某些内容。

阅读更多:Python 教程

atexit模块

但是,如果您要强制Python在解分配时删除某些内容,请使用atexit模块。atexit模块定义了要注册和取消注册清理函数的函数。因此注册的函数会在正常解释器终止时自动执行。atexit以它们被注册的相反顺序运行这些函数;如果您注册P、Q和R,那么在解释器终止时,它们将按R、Q、P的顺序运行。

让我们看看如何在Python中安装atexit模块−

pip install atexit

导入atexit−

import atexit

atexit模块的方法

以下是方法−

  • atexit.register(func, *args, **kwargs) − 将func注册为在终止时要执行的函数。希望传递给func的任何可选参数都必须作为register()的参数传递。

  • atexit.unregister(func) − 从要在解释器关闭时运行的函数列表中删除func。如果以前未注册func,则unregister()将无声地不执行任何操作。如果func已经多次注册,那么atexit调用堆栈中的每个函数出现都将被删除。

案例

让我们看一个例子–

try:
   with open('counterfile') as infile:
      _count = int(infile.read())
except FileNotFoundError:
   _count = 0

def incrcounter(n):
   global _count
   _count = _count + n
def savecounter():
   with open('counterfile', 'w') as outfile:
      outfile.write('%d' % _count)
import atexit
atexit.register(savecounter)

上面的示例演示了如何在导入模块时从文件初始化计数器,并在程序终止时自动保存计数器的更新值,而无需依赖应用程序在终止时显式调用该模块。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程