【问题标题】:Flask + uwsgi + nginx: When is memory released?Flask + uwsgi + nginx:内存什么时候释放?
【发布时间】:2014-08-19 14:36:32
【问题描述】:

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

【问题讨论】:

    标签: python nginx flask uwsgi flask-sqlalchemy


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多