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

标签 python macos python-3.x urllib

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

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 ​​路由器接口(interface)的事件连接数,它一直在上升。如果脚本继续运行,它将耗尽路由器的 4096 个连接限制。发生这种情况时,脚本只是进入等待状态(路由器将不允许新连接,但超时尚未达到)。几分钟后,这些连接将关闭,脚本可以再次恢复。

我能够从路由器观察那些挂起连接的状态。它们共享相同的状态:TIME_WAIT。

我希望此脚本同时使用不超过 1 个 TCP 连接。我做错了什么?

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

最佳答案

通过一些研究,我发现了这个问题的原因:the design of TCP protocol .简而言之,当您断开连接时,连接不会立即断开,而是进入“TIME_WAIT”状态,并会在 4 分钟后超时。与我的预期不同,连接并没有立即消失。

根据 this question ,也无法强制断开连接(无需重新启动网络堆栈)。

结果在我的特殊情况下,例如 this question stated ,更好的选择是使用持久连接,也就是 HTTP keep-alive。当我查询同一台服务器时,这会起作用。

关于Python3 urllib.request 不会立即关闭连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26826410/

相关文章:

c++ - 如何在 Os X 上用 C++ 获取模块的基地址

macos - 如何为这样的应用程序窗口着色?

python-3.x - InternalError : current transaction is aborted, 命令在 UNIQUE 约束下被忽略,直到事务 block 结束

python - 是否有可能找出一个类的实例是否有 __dict__ ?

python - MySQLdb 安装错误 - _mysql.c :44:23: error: my_config. h: No such file or directory

python - 将两个矩阵划分为8个小矩阵的更快方法

python - 如何计算一维卷积神经网络的参数个数?

c++ - CUDA 示例由于多个重新定义错误而未编译

python-3.x - 如何使用 python 在另一个云函数中调用云函数并传递一些输入参数或参数?

python - 在 Windows 中使用 Protocol Buffer