为什么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)
上面的示例演示了如何在导入模块时从文件初始化计数器,并在程序终止时自动保存计数器的更新值,而无需依赖应用程序在终止时显式调用该模块。
极客教程