Flask + uwsgi + nginx:内存何时发布?

我正在用Flask构build一个API。

例如,如果我有这样一个烧瓶路线:

@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}) 

在返回响应之后,variables“tasks”和“task_list”使用的内存是否会立即释放?

就我而言,似乎uwsgi进程并没有释放他们用于每个请求的内存,至less在每次返回之后似乎都没有做好。

通过使用Flask-SQLAlchemy扩展从MySQL数据库中检索任务。

谢谢!

编辑:这是我的uwsgiconfiguration文件(/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 

taskstask_list都是局部变量,当view函数返回时这些变量将被解除绑定。

如果其内容内存被释放取决于其他数据还是对数据的引用存在。 当Python引用计数下降到0时,Python对象被清除,所以如果其他东西仍然引用这个函数以外的对象,那么它们将不会被清除。

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

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