转自:https://www.zhihu.com/question/38614659
测试报告发现网络链接没有关闭。后来发现是由于复用了asynchttpclient,所以一直没有关闭连接。
摘自知乎
之前一段时间,一直在用tornado的异步客户端。 http_client = AsyncHTTPClient()response = yield http_client.fetch(url, method=‘POST’, body=data)response.body…..但是从来没写过:http_client.close()这样的代码。类似的,同步的阻塞请求,我一般使用python的requests库:response = requests.post(url, body)response.content但是也没有调用过类似close()的方法, 按理来说,数据库连接,文件句柄,网络连接,这些非托管资源,不是都应该手动去关闭的么?我记得比较“低级”的http库确实会调用关闭: HTTPConnection.close(),那么我的问题是1.我在tornado的http客户端,和requests库中,如何关闭它们?2.是否是因为本质上,这两个客户端在关闭方式上就是不同的。3.如果不关,我的服务长期这样跑着,总有一天会大量内存泄露吧?
作者:彭泉鑫链接:https://www.zhihu.com/question/38614659/answer/77237485来源:知乎著作权归作者所有,转载请联系作者获得授权。HTTPClient对象销毁的时候,会自动关闭连接,这是写在__del__中的tornado/httpclient.py at c4183b86890ffadbdb23fd7beac756c7990a035e · tornadoweb/tornado · GitHubAsyncHTTPClient也有close方法,根据官方的文档:close()This method is not needed in normal use due to the way that AsyncHTTPClient objects are transparently reused. close() is generally only necessary when either theIOLoop is also being closed, or the force_instance=True argument was used when creating theAsyncHTTPClient.该方法通常是不会用到的,因为AsyncHTTPClient对象会自动被复用(对用户是透明的)。只有在IOLoop也被关闭,或者创建的时候设置了 force_instance=True,才有必要去用它。实际上,在IOLoop关闭的时候,它会自动被回收。1.我在tornado的http客户端,和requests库中,如何关闭它们?一般情况下不用手动关闭,对象销毁的时候(或者IOLoop关闭的时候)会自动关闭连接2.是否是因为本质上,这两个客户端在关闭方式上就是不同的。不是,底层都是一样的HTTP连接,只不过另一个使用起来是异步的(通过协程的方式)3.如果不关,我的服务长期这样跑着,总有一天会大量内存泄露吧?大量无用的连接用完不释放,必然会导致内存泄漏,但你不用担心, 因为在tornado和requests里这些HttpConnection会被自动回收编辑于 2015-12-17新闻热点
疑难解答