相关疑难解决方法(0)

我应该在urllib.urlopen()之后调用close()吗?

我是Python新手并阅读其他人的代码:

应该urllib.urlopen()跟着urllib.close()?否则,一个人会泄漏连接,对吗?

python urllib

70
推荐指数
3
解决办法
4万
查看次数

如何在Python中使用urllib2关闭超时的http POST?

概观

我正在使用Python 2.7.1 urllib2包中的urlopen从Windows XP机器到远程Apache Web服务器(例如Mac OS X的内置Web共享)执行HTTP POST.发送的数据包含一些标识符,数据和校验和,如果发送了所有数据,则服务器以确认响应.数据中的校验和可用于检查一切是否按顺序到达.

问题

通常这很好用,但有时互联网连接不好,通常是因为发送数据的客户端使用wifi或3G连接.这导致互联网连接丢失一段任意时间.urlopen包含一个超时选项,以确保它不会阻止您的程序,它可以继续.

这就是我想要的,但问题是urlopen不会阻止套接字继续发送超时发生时仍然必须发送的任何数据.我通过尝试向我的笔记本电脑发送大量数据来测试这个(我将在下面显示的代码),我会在两个show activity上看到网络活动,然后我会在笔记本电脑上停止无线,等待直到该功能超时,然后重新激活无线,然后数据传输将继续,但程序将不再监听响应.我甚至试图退出Python解释器,它仍然会发送数据,因此控制权以某种方式传递给Windows.

原因

超时(据我所知)的工作方式如下:它检查'空闲响应时间'
([Python-Dev]将套接字超时添加到urllib2)
如果将超时设置为3,它将打开连接,启动计数器然后尝试发送数据并等待响应,如果在接收响应之前的任何时刻计时器用完,则调用超时异常.请注意,就超时计时器而言,发送数据似乎不算作"活动".
(urllib2超时但没有关闭套接字连接)
(关闭urllib2连接)

显然它是在某个地方陈述当套接字被关闭/解除引用/垃圾收集时它调用它的'close'函数,它等待在关闭套接字之前发送所有数据.但是还有一个关闭功能,它应该立即停止套接字,防止发送更多数据.
(socket.shutdown vs socket.close)
(http://docs.python.org/library/socket.html#socket.socket.close)

我想要的是

我希望在发生超时时连接为"关闭".否则,我的客户将无法判断数据是否已正确接收,并且可能会尝试再次发送.我宁愿直接杀死连接并稍后再试,因为知道数据(可能)没有成功发送(如果校验和不匹配,服务器可以识别这个).

这是我用来测试它的代码的一部分.try..except部分还没有像我期望的那样工作,任何帮助也有所值得赞赏.正如我之前所说,我希望程序在引发超时(或任何其他)异常时立即关闭套接字.

from urllib import urlencode
from urllib2 import urlopen, HTTPError, URLError
import socket
import sys

class Uploader:
    def __init__(self):
        self.URL = "http://.../"
        self.data = urlencode({'fakerange':range(0,2000000,1)})
        print "Data Generated"

    def upload(self):
        try:
            f = urlopen(self.URL, self.data, timeout=10)
            returncode = f.read()
        except (URLError, HTTPError), msg:
            returncode …
Run Code Online (Sandbox Code Playgroud)

python sockets timeout urllib2 http-post

7
推荐指数
1
解决办法
2027
查看次数

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
Run Code Online (Sandbox Code Playgroud)

内容被正确读取.但由于某种原因,TCP连接不会关闭.我正在观察来自dd-wrt路由器接口的活动连接数,并且它一直在上升.如果脚本继续运行,它将耗尽路由器的4096连接限制.发生这种情况时,脚本只需进入等待状态(路由器不允许新连接,但超时尚未命中).几分钟后,这些连接将被关闭,脚本可以再次恢复.

我能够观察到路由器悬挂连接的状态.它们共享相同的状态:TIME_WAIT.

我希望这个脚本同时使用不超过1个TCP连接.我究竟做错了什么?

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

python macos urllib python-3.x

7
推荐指数
1
解决办法
1138
查看次数

标签 统计

python ×3

urllib ×2

http-post ×1

macos ×1

python-3.x ×1

sockets ×1

timeout ×1

urllib2 ×1