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

He Shiming

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

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。

He Shiming

通过一些研究,我发现了此问题的原因:TCP协议的设计简而言之,当您断开连接时,连接不会立即断开,它会进入“ TIME_WAIT”状态,并且会在4分钟后超时。与我所期望的不同,该连接不会立即消失。

根据此问题,也无法强行断开连接(无需重新启动网络堆栈)。

事实证明,在我的特殊情况下,就像这个问题所述,一个更好的选择是使用持久连接,也就是HTTP keep-alive。当我查询同一台服务器时,这将起作用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将代理设置为urllib.request(Python3)

来自分类Dev

Python3:Urllib.request无法正常工作

来自分类Dev

Python urllib3:一段时间后关闭空闲连接

来自分类Dev

urllib2比python3中的请求慢吗

来自分类Dev

Python 3:urllib.request.urlopen和Progressbar

来自分类Dev

Python 3:urllib.request.urlopen和Progressbar

来自分类Dev

Python request.packages.urllib3.connection.VerifiedHTTPSConnection [Errno 11004]

来自分类Dev

Python XML解析,lxml,urllib.request

来自分类Dev

python request / urllib3连接池未捕获HTTP错误

来自分类Dev

使用Python3 asyncio并发HTTP get请求不会关闭连接

来自分类Dev

使用Python3 asyncio并发HTTP get请求不会关闭连接

来自分类Dev

互联网连接中断时,Python的urllib.request.urlopen

来自分类Dev

Urllib2 Python-重新连接和拆分响应

来自分类Dev

How can I use urllib.request.urlretrieve with python 2.7

来自分类Dev

python 3.3的urllib.request无法下载文件

来自分类Dev

Python 3.4 urllib.request错误(http 403)

来自分类Dev

python:urllib.request.urlopen不起作用

来自分类Dev

Python 3.5 urllib.request 403禁止错误

来自分类Dev

urllib.request 的 urlopen 无法在 python 3.7 中打开页面

来自分类Dev

Python urllib请求多次

来自分类Dev

Python urllib AttributeError

来自分类Dev

Python Urllib ContextualVersionConflict

来自分类Dev

Python3:自定义加密标头 URLLIB - KrakenAPI

来自分类Dev

python3 urllib,发出没有数据的放置请求

来自分类Dev

Python请求URLLib3连接池大小

来自分类Dev

Python 3 urllib:循环中有530个连接过多

来自分类Dev

Python请求,警告:urllib3.connectionpool:连接池已满

来自分类Dev

Python 3-带有urllib.request的POST请求返回HTML数据

来自分类Dev

为什么我能够在python 3 urllib.request中读取HEAD http请求?

Related 相关文章

  1. 1

    将代理设置为urllib.request(Python3)

  2. 2

    Python3:Urllib.request无法正常工作

  3. 3

    Python urllib3:一段时间后关闭空闲连接

  4. 4

    urllib2比python3中的请求慢吗

  5. 5

    Python 3:urllib.request.urlopen和Progressbar

  6. 6

    Python 3:urllib.request.urlopen和Progressbar

  7. 7

    Python request.packages.urllib3.connection.VerifiedHTTPSConnection [Errno 11004]

  8. 8

    Python XML解析,lxml,urllib.request

  9. 9

    python request / urllib3连接池未捕获HTTP错误

  10. 10

    使用Python3 asyncio并发HTTP get请求不会关闭连接

  11. 11

    使用Python3 asyncio并发HTTP get请求不会关闭连接

  12. 12

    互联网连接中断时,Python的urllib.request.urlopen

  13. 13

    Urllib2 Python-重新连接和拆分响应

  14. 14

    How can I use urllib.request.urlretrieve with python 2.7

  15. 15

    python 3.3的urllib.request无法下载文件

  16. 16

    Python 3.4 urllib.request错误(http 403)

  17. 17

    python:urllib.request.urlopen不起作用

  18. 18

    Python 3.5 urllib.request 403禁止错误

  19. 19

    urllib.request 的 urlopen 无法在 python 3.7 中打开页面

  20. 20

    Python urllib请求多次

  21. 21

    Python urllib AttributeError

  22. 22

    Python Urllib ContextualVersionConflict

  23. 23

    Python3:自定义加密标头 URLLIB - KrakenAPI

  24. 24

    python3 urllib,发出没有数据的放置请求

  25. 25

    Python请求URLLib3连接池大小

  26. 26

    Python 3 urllib:循环中有530个连接过多

  27. 27

    Python请求,警告:urllib3.connectionpool:连接池已满

  28. 28

    Python 3-带有urllib.request的POST请求返回HTML数据

  29. 29

    为什么我能够在python 3 urllib.request中读取HEAD http请求?

热门标签

归档