python-2.7 - Python urllib2 不尊重超时

标签 python-2.7 urllib2

以下两行代码永远挂起:

import urllib2
urllib2.urlopen('https://www.5giay.vn/', timeout=5)

这是使用 python2.7,我没有设置 http_proxy 或任何其他环境变量。任何其他网站都可以正常工作。我也可以毫无问题地访问该站点。可能是什么问题?

最佳答案

如果你跑

import urllib2

url = 'https://www.5giay.vn/'
urllib2.urlopen(url, timeout=1.0)

等几秒钟,然后用C-c中断程序,你会看到
  File "/usr/lib/python2.7/ssl.py", line 260, in read
    return self._sslobj.read(len)
KeyboardInterrupt

这说明程序卡在self._sslobj.read(len)上.

SSL timeouts raise socket.timeout .

您可以通过调用控制在 socket.timeout 引发之前的延迟socket.setdefaulttimeout(1.0) .

例如,
import urllib2
import socket

socket.setdefaulttimeout(1.0)
url = 'https://www.5giay.vn/'
try:
    urllib2.urlopen(url, timeout=1.0)
except IOError as err:
    print('timeout')
% time script.py
timeout

real    0m3.629s
user    0m0.020s
sys 0m0.024s

请注意 the requests module虽然在这里成功 urllib2没有:
import requests
r = requests.get('https://www.5giay.vn/')

如何对整个函数调用强制超时:
socket.setdefaulttimeout如果服务器未发出响应,则仅影响 Python 在引发异常之前等待的时间。

既不是它也不是 urlopen(..., timeout=...)对整个函数调用强制执行时间限制。

为此,您可以使用 eventlet,as shown here .

如果您不想安装 eventlets ,您可以使用 multiprocessing来自标准库;尽管此解决方案的扩展性不如异步解决方案,例如 eventlets提供。
import urllib2
import socket
import multiprocessing as mp

def timeout(t, cmd, *args, **kwds):
    pool = mp.Pool(processes=1)
    result = pool.apply_async(cmd, args=args, kwds=kwds)
    try:
        retval = result.get(timeout=t)
    except mp.TimeoutError as err:
        pool.terminate()
        pool.join()
        raise
    else:
        return retval

def open(url):
    response = urllib2.urlopen(url)
    print(response)

url = 'https://www.5giay.vn/'
try:
    timeout(5, open, url)
except mp.TimeoutError as err:
    print('timeout')

运行此操作将在挂钟时间的大约 5 秒内成功或超时。

关于python-2.7 - Python urllib2 不尊重超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27327787/

相关文章:

python - 无法使用 Python 登录安全页面

python - 在线程函数中声明函数是好的编程风格吗?

python - 在 python 2.7 中使用 PI

pandas - 按元素拆分列并使用 pandas 创建新列

python - 使用python请求或类似模块登录www.virtualtrader.co.uk?

python - 如何使用 Python 脚本(请求库)保持登录网站?

python - 在没有 http ://的情况下修复 url 的正确方法

python - Python 的 'a+' 文件打开模式中的错误?

python-2.7 - 无法登录 gmail - imaplib.error - ALERT 请通过您的网络浏览器登录

python - Python的urllib2有gethostbyname函数吗?