python - 使用 Python urllib2.urlopen 检测挂起

标签 python sockets networking

我正在使用 Python's urllib2发送 HTTP 帖子:

import socket, urllib, urllib2

socket.setdefaulttimeout(15)    

postdata = urllib.urlencode({'value1' : 'a string', 'value2' : 'another string'})
headers = {
    'User-Agent': 'Agent',
    'Content-Type': 'application/x-www-form-urlencoded',
    'Accept': 'text/html, */*',
}

try: 
    request = urllib2.Request('http://www.example.com', postData, headers)
    response = urllib2.urlopen(request)
except urllib2.HTTPError, e:
    # Handle here
except urllib2.URLError, e:
    # Handle here
except httplib.HTTPException, e:
    # Handle here

有时,网络问题会导致对 urlopen 的调用永远不会返回。我们看到 except block 正确处理了其他错误(包括超时)并调用了 socket.setdefaulttimeout() 但仍然存在 urlopen 永远不会返回的实例。

我知道它永远不会返回,因为我们的实际代码中有一些日志行在之前和之后被调用,当这个问题发生时,只会进行之前的调用,脚本永远挂起。

检测/处理此问题的最佳方法是什么?

最佳答案

您可以使用信号,首先为您的信号设置一个处理程序

import signal
...
def handler(signum, frame):
    print 'Signal handler called with signal', signum
...
signal.signal(signal.SIGALRM, handler)

并在 urlopen 调用之前发出警报

signal.alarm(5)
response = urllib2.urlopen(request)
signal.alarm(0) # Disable the signal

5 秒后(或您希望的时间),如果警报未禁用(如果 urlopen 永远不会返回),操作系统将调用处理程序。关于信号模块的更多信息:http://docs.python.org/library/signal.html

关于python - 使用 Python urllib2.urlopen 检测挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5565291/

相关文章:

ios - 在 AppDelegate 中连接时获取套接字输入时出错

java - 如何检查URL是否不存在?

python - 加载 MySQLdb 模块时出错 'Did you install mysqlclient or MySQL-python?'

python - 如何从带有子元组的元组创建列表?

java - 无法使用serversocket在java中同时读取和发送请求

sockets - 如何将 Flutter 应用程序连接到 tcp 套接字服务器?

Java - 通过UDP连接从一台PC发送消息到另一台PC

networking - 如何连接到DHT引导节点?

python - 我应该合并内存 (.py) 中的图像还是 View (HTML) 中的图像?

python - 连接两个numpy数组问题