Python3 urllib.request不会立即关闭连接

我有下面的代码来运行一个连续的循环来从网站获取一些内容:

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保持连接。 当我查询同一台服务器时,这会起作用。

链接地址: http://www.djcxy.com/p/82449.html

上一篇: Python3 urllib.request will not close connections immediately

下一篇: Finding difference between strings in Javascript