Python烧瓶线程不会关闭

时间:2018-05-18 09:09:37

标签: python multithreading flask garbage-collection

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

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

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

是因为内存没有被释放?

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

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)

1 个答案:

答案 0 :(得分:0)

看起来问题是paramiko对象没有关闭。打开SFTPClientSSHClient后,必须明确关闭它。我假设随着我的类对象(定义了paramiko对象),它将被关闭。但它没有。

所以在我的过程结束时,我打电话给下面的行。现在线程似乎正在正确关闭

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