我用烧瓶写了一个应用程序,用芹菜来完成一个长期运行的任务。在进行负载测试时,我注意到芹菜任务即使在完成任务后也不会释放内存。所以我在谷歌上找到了这个小组讨论。。在
在讨论中,它说,这就是python的工作原理。在
“但是从操作系统的角度来看,程序的大小是分配给Python的总(最大)内存。由于Python只在Windows上将内存返回给堆上的操作系统(分配小对象以外的其他对象),因此如果您运行在Linux上,您只能看到程序使用的总内存增加。”
我用的是Linux。所以我写了下面的脚本来验证它。在import gc
def memory_usage_psutil():
# return the memory usage in MB
import resource
print 'Memory usage: %s (MB)' % (resource.getrusage(resource.RUSAGE_SELF).ru_maxrss / 1000.0)
def fileopen(fname):
memory_usage_psutil()# 10 MB
f = open(fname)
memory_usage_psutil()# 10 MB
content = f.read()
memory_usage_psutil()# 14 MB
def fun(fname):
memory_usage_psutil() # 10 MB
fileopen(fname)
gc.collect()
memory_usage_psutil() # 14 MB
import sys
from time import sleep
if __name__ == '__main__':
fun(sys.argv[1])
for _ in range(60):
gc.collect()
memory_usage_psutil()#14 MB ...
sleep(1)
输入是一个4MB的文件。即使从“fileopen”函数返回后,4MB内存也没有释放。我在循环运行时检查了htop输出,驻留内存保持在14MB。所以,除非这个过程停止,否则记忆会一直伴随着它。在
因此,如果芹菜工人在任务完成后没有被杀死,它将为自己保留记忆。我知道我可以使用max_tasks_per_child配置值来终止进程并生成一个新进程。有没有其他方法可以从python进程将内存返回给OS?。