[英]Is this a bug of httplib2
我的python程序使用httplib2.Http來發出http請求。 一旦我需要生成一個請求,我創建一個httplib2.Http對象,以便我的程序經常創建/銷毀httplib2.Http對象。
我發現由於達到最大打開文件數,我的程序很容易崩潰。 檢查/ proc // fd,打開套接字fds太多了。 這個問題使我不得不深入研究httplib2源代碼。
然后我發現,在httplib2.Http._conn_request方法中,有這樣的代碼:
else:
content = ""
if method == "HEAD":
conn.close()
else:
content = response.read()
response = Response(response)
if method != "HEAD":
content = _decompressContent(response, content)
break
這表明套接字僅在http方法為HEAD時關閉。 也許httplib2想要以某種方式重用套接字。 但是Http類沒有close()方法。 這意味着當我發出Http請求時,套接字將不會關閉,直到我的進程終止。
然后我修改了代碼:
else:
content = ""
if method == "HEAD":
conn.close()
else:
content = response.read()
response = Response(response)
if method != "HEAD":
content = _decompressContent(response, content)
conn.close() # I ADD THIS CLOSE
break
在那之后,我的計划運作良好。
但我仍然很好奇,如果這是httplib2的錯誤,因為httplib2是一個非常古老而常見的lib。
不,連接未關閉的事實不是錯誤,必須為下一個請求重用連接。
編寫httplib2
的方式,它等待服務器關閉連接或等待超時,它不會主動關閉它們(除了錯誤)。 如果連接已關閉, httplib2
將在下次使用時嘗試重新建立連接。
關閉連接(作為源的補丁)會使這變得不可能,每個請求都必須使用它自己的連接。
銷毀httplib2.Http
對象應該會自動關閉打開的連接,因為它們只在它的connections
字典中引用,所以如果你不保留對你創建的Http
對象的任何引用,它應該可以工作。 你確定你沒有任何引用嗎?
或者,您可以將Connnection: close
標頭傳遞給您的請求:
http.request("http://example.org", headers={'Connection': 'close'})
這應該導致服務器在每次請求后關閉連接。 或者,您可以嘗試手動關閉對象connections
dict中的所有連接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.