【问题标题】:Python flask threads does not closePython烧瓶线程不关闭
【发布时间】:2018-05-18 09:09:36
【问题描述】:

我的 python flask 应用程序使用 nohup 运行。即它总是活的。我看到每次用户从页面提交时它都会创建一个线程。这是因为 flask.run 是 multithread=true。但我的问题是即使处理结束后,线程似乎也没有关闭。我正在使用ps -eLf |grep userid 命令进行检查。在代码执行结束后很长时间内,我看到许多线程仍然处于活动状态。当另一个提交完成时它会被添加。当应用程序本身重新启动时,所有线程都会被删除。

在不重启应用的情况下关闭线程的标准是什么?

these 等许多帖子建议使用 gc.collectdel object 等。 我有许多用户定义的类在提交时被实例化。一个对象引用另一个对象。所以

是因为内存没有被释放吗?

我应该使用gc.collect 还是del objects? 一旦变量的scope 结束,Python 应该清除这些对象。对吗?

app = Flask(__name__)
@app.route('/submit',methods = ['GET','POST'])
def submit():
    #obj1=class1()
    #obj2=class2(obj1)
    #obj3=class3(obj1)
    #refer objects
    #process data
    #done

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=4000, threaded=True, debug=False)

【问题讨论】:

  • Flask 的内置开发服务器确实不适合多线程使用,因此缺乏对线程管理的支持。我建议阅读推荐的部署服务器的优缺点,看看哪个最适合您的需求。热门选择:Gunicorn、Twisted、SocketIO、Gevent、nginx。
  • 这也是一个比较小的网络应用。但很少有用户同时使用。所以没有寻找比烧瓶更好的平台。我肯定会看看上面的其中一个。

标签: python multithreading flask garbage-collection


【解决方案1】:

看起来问题出在paramiko 对象未关闭。一旦打开SFTPClientSSHClient,就必须明确关闭它。我假设它会与我的类对象(定义 paramiko 对象的位置)一起关闭。但它没有。

因此,在我的流程结束时,我会调用以下行。现在线程似乎已正确关闭

    if objs.ssh:
        objs.ssh.close()
    if objs.sftp:
            objs.t.close()
            objs.sftp.close()
    del objs
    gc.collect()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-18
    • 2018-02-02
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 2015-09-29
    • 2014-02-27
    • 1970-01-01
    相关资源
    最近更新 更多