Flask + uwsgi + nginx:什么时候发布内存?

时间:2014-08-19 14:36:32

标签: python nginx flask uwsgi flask-sqlalchemy

我正在使用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

1 个答案:

答案 0 :(得分:2)

taskstask_list都是局部变量,当视图函数返回时,它们将被解除绑定。

如果内存的内容被释放,则取决于其他数据或对数据的引用存在。当引用计数降为0时,Python对象将被清除,因此如果有任何 else 仍然引用此函数之外的对象,则它们将不会被清除。

例如,task_list列表对象没有其他引用,将立即清除。该列表包含新的dict对象(在循环中由d引用),这些对象也没有其他引用,因此将被清除。这些词典包含键的字符串;这些是重复使用的(在这种情况下它们被实习,每个字符串对象只有一个副本)并且不需要被清除。

这会留下t.namet.id值,以及g.user.tasks引用;如果g.user.task是列表对象,那么g.user.task是对该对象的引用,它不会被清除。任何t.namet.id值仍可在其他地方引用,并保持不变。然而,这通常是一件好事。