簡體   English   中英

Python3 urllib.request不會立即關閉連接

[英]Python3 urllib.request will not close connections immediately

我有以下代碼來運行連續循環來從網站獲取一些內容:

from http.cookiejar import CookieJar
from urllib import request

cj = CookieJar()
cp = request.HTTPCookieProcessor(cj)
hh = request.HTTPHandler()
opener = request.build_opener(cp, hh)

while True:
    # build url
    req = request.Request(url=url)
    p = opener.open(req)
    c = p.read()
    # process c
    p.close()
    # check for abort condition, or continue

內容被正確讀取。 但由於某種原因,TCP連接不會關閉。 我正在觀察來自dd-wrt路由器接口的活動連接數,並且它一直在上升。 如果腳本繼續運行,它將耗盡路由器的4096連接限制。 發生這種情況時,腳本只需進入等待狀態(路由器不允許新連接,但超時尚未命中)。 幾分鍾后,這些連接將被關閉,腳本可以再次恢復。

我能夠從路由器觀察到那些懸掛連接的狀態。 它們共享相同的狀態:TIME_WAIT。

我希望這個腳本同時使用不超過1個TCP連接。 我究竟做錯了什么?

我在Mac OS X 10.10上使用Python 3.4.2。

通過一些研究,我發現了這個問題的原因: TCP協議的設計 簡而言之,當您斷開連接時,連接不會立即掉線,它會進入“TIME_WAIT”狀態,並會在4分鍾后超時。 與我期望的不同,連接不會立即消失。

根據這個問題 ,也不可能強行刪除連接(不重新啟動網絡堆棧)。

事實證明,在我的特定情況下,就像這個問題所說 ,更好的選擇是使用持久連接,即HTTP keep-alive。 當我查詢同一台服務器時,這將有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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