轉自: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新聞熱點
疑難解答