Python 如何避免flask web应用程序内存泄漏?

Python 如何避免flask web应用程序内存泄漏?,python,flask,neural-network,uwsgi,ram,Python,Flask,Neural Network,Uwsgi,Ram,我在Ubuntu18上安装了digitalocean服务器,它部署在flask+nginx+uwsgi上。4芯8 Gb RAM。图像通过表单加载,并由神经网络脚本detect.py处理。该操作在执行过程中需要大量RAM(约2GB)。每次迭代脚本后,内存都会减少。到目前为止,在执行了5-6之后,由于内存不足,服务器出现了一个错误。记录RAM消耗,例如(重启后的第一个条目,以及每次迭代后的第一个条目): Uwsgi进程状态和进程内存消耗: 从一开始,我就认为我没有正确配置uwsgi服务器。我试图

我在Ubuntu18上安装了digitalocean服务器,它部署在flask+nginx+uwsgi上。4芯8 Gb RAM。图像通过表单加载,并由神经网络脚本detect.py处理。该操作在执行过程中需要大量RAM(约2GB)。每次迭代脚本后,内存都会减少。到目前为止,在执行了5-6之后,由于内存不足,服务器出现了一个错误。记录RAM消耗,例如(重启后的第一个条目,以及每次迭代后的第一个条目):

Uwsgi进程状态和进程内存消耗:

从一开始,我就认为我没有正确配置uwsgi服务器。我试图添加/更改各种参数,但没有帮助。然后我检查了内置flask服务器上本地计算机上的工作。记忆的问题也是一样的

最有趣的是,如果直接从命令行执行图像处理脚本,就不会有问题。只有通过服务器调用detect.py函数时,才会出现内存泄漏

烧瓶终点:

@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        # check if the post request has the file part
        if 'file' not in request.files:
            flash('No file part')
            return redirect(request.url)
        file = request.files['file']
        # if user does not select file, browser also
        # submit a empty part without filename
        if file.filename == '':
            flash('NO selected file')
            return redirect(request.url)
        if not allowed_file(file.filename):
            flash("Only JPG file is used")
            return redirect(request.url)
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            img = (os.path.join(app.config['UPLOAD_FOLDER'], filename))
            count = detect(images=img)
            return redirect(url_for("result", count=count))
            #return str(count)
    return render_template("index.html")
现在我很困惑,下一步该怎么办?
第二,也许uwsgi中有一个设置可以帮助释放内存,而无需重新启动服务器?

嘿,我也有一个类似的问题。你找到解决方案了吗?@zwlayer我正在为每个视图使用任务队列在每个任务完成后,内存被释放感谢回复。如果可能的话,你能给出更多的数据吗?(可能在您的问题中添加一个编辑,以显示如何在这种情况下应用它?)对不起,我没有任何代码。主要的一点不是直接调用函数,而是将其作为参数传递给队列,RQ模块将使整个内存释放过程成为一个过程。这是否意味着,您将索引函数(在上面的问题中)作为参数传递给队列?这像是代码中的一行更改吗?在您前面提到的文档中,我看到了这两行:
q=Queue(connection=Redis())
result=q.enqueue(在url处计数单词,'http://nvie.com’)
那么,在您的情况下(我再次提到您问题中的代码),您是否应该执行类似于
q=Queue(connection=Redis())
结果=q.enqueue(索引,)
?对不起,如果这是愚蠢的,我不知道任何关于Redic或rq模块。嘿,我有一个类似的问题。你找到解决方案了吗?@zwlayer我正在为每个视图使用任务队列在每个任务完成后,内存被释放感谢回复。如果可能的话,你能给出更多的数据吗?(可能在您的问题中添加一个编辑,以显示如何在这种情况下应用它?)对不起,我没有任何代码。主要的一点不是直接调用函数,而是将其作为参数传递给队列,RQ模块将使整个内存释放过程成为一个过程。这是否意味着,您将索引函数(在上面的问题中)作为参数传递给队列?这像是代码中的一行更改吗?在您前面提到的文档中,我看到了这两行:
q=Queue(connection=Redis())
result=q.enqueue(在url处计数单词,'http://nvie.com’)
那么,在您的情况下(我再次提到您问题中的代码),您是否应该执行类似于
q=Queue(connection=Redis())
结果=q.enqueue(索引,)
?对不起,如果这是愚蠢的,我不知道任何关于Redic或rq模块。