標籤:

tornado的AsyncHTTPClient和requests庫為什麼不關閉連接?

之前一段時間,一直在用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.如果不關,我的服務長期這樣跑著,總有一天會大量內存泄露吧?


謝邀,HTTPClient對象銷毀的時候,會自動關閉連接,這是寫在__del__中的

tornado/httpclient.py at c4183b86890ffadbdb23fd7beac756c7990a035e · tornadoweb/tornado · GitHub

AsyncHTTPClient也有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 the IOLoop is also being closed, or the force_instance=True argument was used when creating the AsyncHTTPClient.

該方法通常是不會用到的,因為AsyncHTTPClient對象會自動被複用(對用戶是透明的)。只有在IOLoop也被關閉,或者創建的時候設置了 force_instance=True,才有必要去用它。實際上,在IOLoop關閉的時候,它會自動被回收。

1.我在tornado的http客戶端,和requests庫中,如何關閉它們?

一般情況下不用手動關閉,對象銷毀的時候(或者IOLoop關閉的時候)會自動關閉連接

2.是否是因為本質上,這兩個客戶端在關閉方式上就是不同的。

不是,底層都是一樣的HTTP連接,只不過另一個使用起來是非同步的(通過協程的方式)

3.如果不關,我的服務長期這樣跑著,總有一天會大量內存泄露吧?

大量無用的連接用完不釋放,必然會導致內存泄漏,但你不用擔心, 因為在tornado和requests里這些HttpConnection會被自動回收


在aiohttp裡面他說你在訪問.text(), 或者.json() 這些方法的時候幫你關閉掉了。 我猜requests應該也是同理吧


先佔坑,晚點回來貼代碼。

@依雲 感謝指正,回去翻了一下代碼果然是你說的那樣,自帶那個並沒有連接復用,沒看代碼亂說真不好。

tornado/simple_httpclient.py at master · tornadoweb/tornado · GitHub

tornado/simple_httpclient.py at master · tornadoweb/tornado · GitHub

1 http1.1裡面有連接復用的,如果請求同樣的站點就不用重新進行tcp初始化了。

2. 有close方法的,我記得備註裡面寫了正常情況下用不到,具體原因得回去貼代碼才有說服力,先挖坑。

第二點的備註鏈接 tornado/httpclient.py at master · tornadoweb/tornado · GitHub

3. 你說的資源耗儘是程序寫的有問題了,內存泄露了,正常的Python程序對象沒有引用了就回收了。

===========================

看了一下其他人的答案,感覺寫的比我好多了就不更了,畢竟已經有大神出來了。


推薦閱讀:

如何評價知乎開始將核心業務向 Go 技術棧遷移?
如何理解Tornado中的協程模塊(gen.coroutine)?
知乎為什麼要選擇用Tornado做為web開發框架,非同步非阻塞模式在此起到了作用?
請問如何處理tornado模板和angular.js的 {{ }} 表達式衝突問題?

TAG:Python | Tornado |