我正在使用Flask构建API。
例如,如果我有像这样的Flask路线:
@app.route('/api/tasks', methods=['GET'])
@auth.login_required
def tasks():
tasks = g.user.tasks
task_list = []
for t in tasks:
d = {}
d['name'] = t.name
d['id'] = t.id
task_list.append(d)
return jsonify({'tasks':task_list})
变量“tasks”和“task_list”使用的内存会在返回响应后立即释放吗?
就我而言,似乎uwsgi进程没有释放他们为每个请求使用的内存,至少看起来他们在每次返回后都没有正确执行。
使用Flask-SQLAlchemy扩展从MySQL数据库中检索任务。
谢谢!
编辑: 这是我的uwsgi配置文件(/etc/flask-uwsgi/flask-uwsgi.ini):
[uwsgi]
master = true
die-on-term = true
processes = 1
threads = 2
logger = file:/var/log/flask-uwsgi/flask-uwsgi.log
我称之为:
uwsgi --socket 127.0.0.1:8080 -w wsgi:app --ini /etc/flask-uwsgi/flask-uwsgi.ini --stats /tmp/statsock --memory-report
答案 0 :(得分:2)
tasks
和task_list
都是局部变量,当视图函数返回时,它们将被解除绑定。
如果内存的内容被释放,则取决于其他数据或对数据的引用存在。当引用计数降为0时,Python对象将被清除,因此如果有任何 else 仍然引用此函数之外的对象,则它们将不会被清除。
例如,task_list
列表对象没有其他引用,将立即清除。该列表包含新的dict
对象(在循环中由d
引用),这些对象也没有其他引用,因此将被清除。这些词典包含键的字符串;这些是重复使用的(在这种情况下它们被实习,每个字符串对象只有一个副本)并且不需要被清除。
这会留下t.name
和t.id
值,以及g.user.tasks
引用;如果g.user.task
是列表对象,那么g.user.task
是对该对象的引用,它不会被清除。任何t.name
和t.id
值仍可在其他地方引用,并保持不变。然而,这通常是一件好事。