flask 写爬虫出现内存不停增大的问题

背景

使用flask写爬虫代码,使用flask-sqlachmery管理数据库

问题描述

刚开始运行代码发现内存一直在增长,以为是内存溢出,不停的审查代码,然而并没有什么变量没回收的地方,加了各种debug,甚至使用gc强行回收都不行,于是开始一行一行的debug调试,观察内存状况,发现在每次session commit的时候都会出现内存大幅度增长,看来问题就出现在了db session这儿了,

解决方案

为啥每次commit后内存会不断增加,而api接口调用时commit session内存不会一直增加呢?于是去看了一下flask-sqlachmery的源码,发现了问题所在

flask 写爬虫出现内存不停增大的问题

可以看到,在flask_sqlachmery 在init_app时,使用了flask teardown_appcontext装饰器,在每次完成app上下文的时候都会将session删除掉,而我在用flask 写爬虫的时候上下文环境一直没变,也没有主动的去删除session然后重新创建,所有导致session中存储的数据越来越多,内存也就一直增加,找到问题原因就好办了,可以每次访问数据库的时候创建一个session,提交完数据将session回收删除,这样就不会出现内存一直增加的情况了。