簡體   English   中英

這是httplib2的錯誤嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM