Python DBAPI 连接超时问题?
我在尝试测试连接失败的情况,但不幸的是,如果主机的IP地址被防火墙屏蔽,它并不会失败。
这是我的代码:
def get_connection(self, conn_data):
rtu, hst, prt, usr, pwd, db = conn_data
try:
self.conn = pgdb.connect(host=hst+":"+prt, user=usr, password=pwd, database=db)
self.cur = self.conn.cursor()
return True
except pgdb.Error as e:
logger.exception("Error trying to connect to the server.")
return False
if self.get_connection(conn_data):
# Do stuff here:
如果我尝试连接一个已知的服务器,但提供了错误的用户名,它会触发异常并失败。
但是,如果我尝试连接一个没有响应的机器(被防火墙屏蔽),它就一直停在 self.conn = pgdb.connect()
这一行,无法继续。
我该如何等待或测试超时,而不是让我的应用在用户输入错误的IP地址时看起来像是卡住了呢?
2 个回答
0
你遇到的情况是防火墙带来的麻烦,而超时是正常的TCP超时现象。
0
你通常可以在连接函数里设置一个超时时间。如果没有这个选项,你可以试试使用socket.timeout或者默认超时设置:
import socket
socket.setdefaulttimeout(10) # sets timeout to 10 seconds
这个设置会对你所有的连接(基于socket的连接)生效,如果等了10秒还没成功,就会失败。